2010-04-10 25 views
5

Şu anda, hangisinin eşleştiğini bulmak için her bir tamsayı öğesini birbirine göre test ediyorum. Diziler kendi kümeleri içinde çoğaltmaları içermez. Ayrıca, diziler her zaman eşit uzunluklarda değildir. Bunu hızlandırmak için herhangi bir hile var mı? Bunu binlerce kez yapıyorum, bu yüzden programımda C# olan bir şişe boynu olmaya başlıyor.Diziler arasındaki eşleşme sayısını bulmanın en hızlı yolu nedir?

+0

Her iki dizide var olan tüm tam sayıların benzersiz bir listesini istediğiniz gibi mi? – Thomas

+0

Thomas'ın yorumuna eklemek için sıralı diziler mi? –

+0

Bunu koymak için başka bir yol olurdu. Her iki kümede ortak olan benzersiz bir liste. Evet, sipariş ediliyorlar. –

cevap

5

kullanın HashSet

var set = new HashSet<int>(firstArray); 
set.IntersectWith(secondArray); 

seti şimdi her iki dizide de mevcut değerleri içerir.

var query = firstArray.Intersect(secondArray); 

Ya diziler zaten sıralanır takdirde iki diziler için kendini yineleme:

+0

Bence istediğin gibi .Intion yerine .Union –

+0

Ahh beyin osuruk! Teşekkürler. Düzenledim. – Josh

+0

HashSet'i IntersectWith ile denediniz ve tüm öğeler üzerinde yinelemeye kıyasla iki kat daha yavaş. –

6

Sen LINQ kullanabilirsiniz

int[] a = { 1, 3, 5 }; 
int[] b = { 2, 3, 4, 5 }; 

List<int> result = new List<int>(); 
int ia = 0; 
int ib = 0; 
while (ia < a.Length && ib < b.Length) 
{ 
    if (a[ia] == b[ib]) 
    { 
     result.Add(a[ia]); 
     ib++; 
     ia++; 
    } 
    else if (a[ia] < b[ib]) 
    { 
     ia++; 
    } 
    else 
    { 
     ib++; 
    } 
} 
+0

@Mark: Kodunuz sessizce dizilerin dizildiğini varsayalım. – Vlad

+1

John dizilerin yukarıdaki yorumlarda sıralandığını belirtmişti. –

0

böyle bir karşılaştırma programınızda bir darboğaz ise, uygun olmayan bir veri yapısı kullanıyor olabilirsiniz. Verilerinizi sıralamak için en basit yol olabilir. Sonra ortak girişleri bulmak için, her iki dizinin sadece bir kez çaprazlanması gerekir. Başka bir seçenek de verileri bir HashSet'te tutmaktır.

İlgili konular