2009-02-19 3 views
3

Учитывая два массива, существует ли быстрый алгоритм для нахождения всех элементов в двух разных? Например, рассмотрим два массива структур Keys (как в клавиатуре). Один представляет собой текущие нажатые клавиши, а другой представляет собой клавиши, нажатые в последний временной интервал.Алгоритм для нахождения разности между двумя массивами

Keys[] oldKeys = LastKeyboardState.GetPressedKeys(); 
Keys[] currKeys = CurrentKeyboardState.GetPressedKeys(); 

// the user just pressed these key(s) during the last timestep. 
Keys[] diff = ... 

Предложения высоко оценены!

ответ

5

Попробуйте

var diff = oldKeys.Except(currKeys); 

Это требует C# 3.0

+0

ли за исключением включать currKeys, которые не находятся в oldKeys? – DevinB

+1

@devinb, за исключением возврата oldKeys, кроме тех случаев, когда они также отображаются в currKeys. – JaredPar

1

Два битовые поля, запустить двоичный XOR. Независимо от того, с кем вы остались, это то, что вы хотите.

+0

Как это работает для массивов? {A, B} и {B, A} не совпадают, не так ли? И ваше имя УДИВИТЕЛЬНО. – DevinB

+0

У вас есть образец кода для этого? –

+0

@ Gordon: мой ответ был из алгоритмического POV. Я не уверен, что бит-поля работают на C#. Но если у вас есть массивы символов, вы всегда можете подделать их. Теперь все, что у вас осталось, - бит. Могу ли я объяснить? – dirkgently

2

Чтобы следить за JaredPar: это будет показывать ключи только в oldKeys, но не в currKeys. Поэтому, если A находится в currKeys, но не в oldKeys, он не будет отображаться в diff.

var diff = oldKeys.Union(currKeys).Except(currKeys.Intersect(oldKeys)) 

Получит эти, а также.

6

Ну, алгоритм грубой силы будет m * n, где m и n - размеры ваших двух массивов.

Если вы используете какой-либо дерева вместо линейного массива, то ваше время падает до м * log2 (п)

Алгоритм, который

foreach(key ok in oldkeys) 
{ 
    if(!oldKeys.Contains(ok)) 
    { 
     diff.add(ok); 
    } 
} 
foreach(key nk in newkeys) 
{ 
    if(!newKeys.Contains(nk)) 
    { 
     diff.add(nk); 
    } 
} 
+0

Typo: "! OldKeys.Contains (ok)" должно быть "! NewKeys.Contains (ok)" и наоборот. – rocketsarefast