#arrays #algorithm #time-complexity
Вопрос:
Предположим, что входной массив из n целых чисел содержит только целые числа в диапазоне от-5000n до 6000n. Нам нужно найти алгоритм, который определит, содержит ли массив три элемента, сумма которых равна нулю, за O(n log n) времени.
Мой Подход:
1. Sort in O(n log n) time.
2. Run a loop in O(n) time
3. Fix two left and right pointers in the sorted array as the two endpoints
4. find = SUM - (A[left] A[right])
5. Search for the third element (find) using binary search in O(log n)
6. if found then return TRUE
7. else
8.
Я застрял на шаге 8, что если алгоритм двоичного поиска возвращает значение false, то как следует настраивать левый и правый указатели?
Кроме того, будет ли работать весь алгоритм, чтобы найти три элемента, сумма которых равна нулю, в каждом случае, поскольку я не оцениваю все возможные комбинации?
Подсказка — была дана как использование полиномиального алгоритма FFT Ref1 FFT, Ref2 FFT
Комментарии:
1. что вы подразумеваете под n в этих числах-5000n и 6000n?
2. не могли бы вы, пожалуйста, поделиться ограничениями этой проблемы?
3. [-5000n, 6000n] — это диапазон целых чисел, которые может содержать массив.
4. если вы хотите O(n^2) soln, я поделюсь им с вами
5. Если возможно, если поднимите вопрос, иначе в следующий раз я не смогу опубликовать сообщение.
Ответ №1:
Вы не на пути к алгоритму O(N log N). Ваш алгоритм будет либо O(N 2), либо нарушен, в зависимости от того, как вы его закончите.
Этот вопрос должен быть решен с помощью свертки БПФ, как это:
- Выделите массив размером W, где W-степень 2 и больше 22001N.
- Заполните массив нулями, а затем установите array[v 5000N]=1 для каждого значения v во входном массиве.
- Сверните массив с самим собой: вычислите БПФ, возведите в квадрат каждое полученное значение, а затем вычислите IFFT.
- Для каждого значения v во входных данных проверьте, не превышает ли ifft[10000N-v] > 0. Если это так, то во входных данных есть два числа, которые складываются в-v. Отсортируйте входной массив и используйте обычный поиск с двумя указателями, чтобы найти эти два других числа.