2010-04-10 18 views
5

Attualmente, sto testando ogni elemento intero l'uno contro l'altro per trovare quelli corrispondenti. Gli array non contengono duplicati all'interno del proprio set. Inoltre, gli array non sono sempre di uguale lunghezza. Ci sono trucchi per accelerare? Lo sto facendo migliaia di volte, quindi sta iniziando a diventare un collo di bottiglia nel mio programma, che è in C#.Qual è il modo più veloce per trovare il numero di corrispondenze tra gli array?

+0

È necessario semplicemente un elenco univoco di tutti gli interi esistenti in entrambi gli array? – Thomas

+0

Per aggiungere al commento di Thomas, gli array sono ordinati? –

+0

Sarebbe un altro modo di dirlo. Una lista unica comune in entrambi i set. Sì, sono ordinati. –

risposta

5

Utilizzare un HashSet

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

Il set contiene ora solo i valori che esistono in entrambi gli array.

+0

Penso che tu voglia .Intersect piuttosto che .Union –

+0

Ahh cervello scoreggia! Grazie. L'ho modificato – Josh

+0

Ho appena provato HashSet con IntersectWith ed è due volte più lento rispetto all'iterazione di tutti gli elementi. –

6

Si potrebbe usare LINQ:

var query = firstArray.Intersect(secondArray); 

O se gli array sono già ordinati si potrebbe iterare i due array da soli:

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: il tuo codice suppone silenziosamente che gli array siano ordinati – Vlad

+1

John ha già dichiarato che gli array sono ordinati nei commenti sopra. –

0

Se tale confronto è un collo di bottiglia nel vostro programma, stai forse usando una struttura di dati inappropriata. Il modo più semplice potrebbe essere quello di mantenere ordinati i tuoi dati. Quindi, per trovare le voci comuni, è necessario attraversare entrambi gli array una sola volta. Un'altra opzione sarebbe mantenere i dati in un HashSet.

Problemi correlati