2010-04-10 3 views
5

В настоящее время я тестирую каждый целочисленный элемент друг против друга, чтобы найти, какие из них совпадают. Массивы не содержат дубликатов в пределах их собственного набора. Кроме того, массивы не всегда равны длинам. Есть ли уловки, чтобы ускорить это? Я делаю это тысячи раз, поэтому он начинает превращаться в шею бутылки в моей программе, которая находится на C#.Какой самый быстрый способ найти количество совпадений между массивами?

+0

Разве вам просто нужен уникальный список всех целых чисел, которые существуют в обоих массивах? – Thomas

+0

Чтобы добавить комментарий к Томасу, заданы ли массивы? –

+0

Это было бы другим способом положить это. Уникальный список, общий для обоих наборов. Да, они заказаны. –

ответ

5

Используйте HashSet

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

Набор теперь содержит только те значения, которые существуют в обоих массивах.

+0

Я думаю, что вы хотите .Intersect, а не .Union –

+0

Ahh brain fart! Благодарю. Я отредактировал его. – Josh

+0

Просто попробовал HashSet с IntersectWith и он в два раза медленнее по сравнению с итерацией по всем элементам. –

6

Вы можете использовать LINQ:

var query = firstArray.Intersect(secondArray); 

Или если массивы уже отсортированы можно перебирать двух массивов себя:

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: ваш код молча предполагает, что массивы отсортированы – Vlad

+1

Джон уже заявил, что массивы упорядочены в комментариях выше. –

0

Если такое сравнение является узким местом в вашей программе, возможно, вы используете неподходящую структуру данных. Самый простой способ - сохранить сортировку данных. Затем, чтобы узнать общие записи, вам нужно будет проходить оба массива только один раз. Другой вариант - сохранить данные в HashSet.