Вы можете воспользоваться некоторыми общими приемами для повышения производительности вашего алгоритма.
1) Не храните то, что вы используете, только один раз
Распространенная ошибка - хранить больше, чем вам действительно нужно. Всякий раз, когда кажется, что ваши требования к памяти взрывают, первый вопрос, который вы задаете себе: Действительно ли мне нужно хранить эти вещи? Здесь оказывается, что вы не (как объяснил Стив в комментариях) вычислить сумму два числа (треугольным способом, чтобы избежать повторения), а затем проверьте наличие третьего.
Мы отбрасываем O (N ** 2) сложность памяти! Теперь ожидаемая память O (N).
2) Знайте свои структуры данных, и в частности: хеш-таблицу
Идеально Хеш-таблицы используются редко (если вообще когда-либо), но (теоретически) возможно создать хеш-таблицы с O (1) характеристиками вставки, проверки и удаления, и на практике вы подходите эти сложности (хотя обычно это происходит за счет высокого постоянного фактора, который заставит вас предпочесть так называемые неоптимальные подходы).
Поэтому, если вам не нужен порядок (по какой-то причине), членство лучше проверять с помощью хеш-таблицы в целом.
Мы отбрасываем термин 'log N' в сложности скорости.
С этими двумя рекомендациями вы легко получите то, что просили:
- Создайте простую хеш-таблицу: номер является ключом, индекс, связанный со спутниковыми данными
- Выполните итерацию в виде треугольника для вашего набора данных:
for i in [0..N-1]; for j in [i+1..N-1]
- На каждой итерации проверяйте, есть ли
K = M - set[i] - set[j]
в хеш-таблице, если это так, извлекайте k = table[K]
и , если k != i
и k != j
сохраняют тройной (i,j,k)
в вашем результате .
Если одного результата достаточно, вы можете прекратить итерации, как только получите первый результат, в противном случае вы просто сохраните все тройки.