2014-11-05 4 views
2

Учитывая два массива (не отсортированные) M и N. Мне нужно найти три индекса x, y (в M) и z (в N), для которых M [x] + M [y] = N [z]. Мой первоначальный алгоритм принимает решение O (m * m * n). Обратите внимание: я должен найти индексы, и сортировка изменит индексы.Найдите три индекса x, y, z таких, что M [x] + M [y] = N [z]

O (м * м * п) псевдокод (где т и п длина соответствующего массива):

for(int i = 0; i < m - 1; i++) 
    for(int j = i + 1; j < m; j++) 
     for(int k = 0; k < n; k++) 
      if(M[i] + M[j] == N[k] { 
       print i, j, k 
      } 

Я ищу более оптимальное решение.

Спасибо.

+1

есть поиск google о проблеме 'k-SAT'. в частности, вы решаете проблему «2-SAT», которая находится в ключевом слове P. optimization: meet-in-the-middle. – HuStmpHrrr

ответ

2

Вставьте M в массив хэшей (хеш-набор/хэш-таблица), поэтому у вас будет O(1) содержит чек. Затем перебрать все элементы в N и внутри этой петле перебрать ваш хэш-набор, псевдокод:

foreach(integer x in N) 
    foreach(integer setY in hashArray) 
     if (hashArray.Contains(x - setY)) 
     then your solution is: setY + (x-setY) = x; 

Вы можете найти эти вещи индексы в линейное время. Общее время работы: O(|N|*|M|). Имейте в виду, что вам может понадобиться обрабатывать угловые случаи (например, x = 2 * setY).

+0

Использование Хэша скажет мне, что существует только один элемент. Мне нужно найти индексы. Поиск индексов будет иметь дополнительную сложность. – HottyDunker

+1

уверен, но это не изменит время работы (с точки зрения асимптотики - big-O), сохраните решение, сломайте все петли и пойдите для линейного сканирования в оригинальном массиве. Приблизительное время работы задается функцией f (n, m) = n * m + n + m, f = O (n * m) – fex

Смежные вопросы