Есть еще одно очень быстрое решение: представьте, что вам нужно решить эту проблему в Java примерно за 1 млрд. Целых чисел. Вы знаете, что в Java целые числа идут от -2**31+1
до +2**31
.
Создание массива с 2**32
миллиардами бит (500 МБ, тривиально на современном оборудовании).
Итерация по вашему набору: если у вас есть целое число, установите соответствующий бит в 1.
O (n) пока.
Повторите итерацию по вашему набору: для каждого значения проверьте, установлен ли у вас бит "current val - x".
Если он у вас есть, вы возвращаете true.
Конечно, ему нужно 500 МБ памяти.
Но это должно обойти любое другое решение O (n log n), если, скажем, вам нужно решить эту проблему с 1 миллиардом целых чисел.
О (п).