Алгоритм, который использует хеширование, занимает 10-900 микросекунд в Python (среднее значение: 200, медиана: 60):
#!/usr/bin/env python
import random
L = frozenset(random.sample(xrange(2**31), 10**6))
print next(((a,b,a+b) for a in L for b in L if (a + b) in L), None)
Это O(N**2)
, но, кажется, это достаточно быстро.
Для сравнения амортизированная O(N)
операция создания frozenset
занимает 270
миллисекунд (в 1000 раз медленнее, чем поиск), а для создания случайного списка требуется 0.9
секунд .
Примечание: random.sample
не возвращает повторяющиеся элементы, если входная последовательность содержит уникальные элементы, поэтому frozenset
не удаляет какие-либо элементы в приведенном выше примере. Чтобы решить проблему для случайной последовательности, которая допускает повторяющиеся элементы, мы должны использовать две структуры данных:
#!/usr/bin/env python
import random
L = [random.randrange(2**31) for _ in xrange(10**6)]
S = frozenset(L)
print len(L), len(S)
print next(((a, b, a+b) for a in L for b in L if (a + b) in S), None)
выход
1000000 999762
(2055933464, 83277289, 2139210753)