Есть некоторые тонкости, но вы правы, что средняя производительность для решения проблемы может быть настолько хорошей.Однако для этого требуются два хеш-карты, а не один.
Первый хеш-файл находится слева, и он будет храниться как значение (i1, j1)
, где i1 < j1
и j1
- это минимальный индекс, для которого эта сумма может бытьдостигается.
Второй хэш-файл справа, и он будет храниться как значение (i2, j2)
, где i2 < j2
и i2
- максимальный индекс, для которого эта сумма может быть достигнута.
Теперь бегите по клавишам первой хэш-карты, ища противоположную в другой.Если они оба там и j1 < i2
, значит, у вас есть четверка.
Однако обратите внимание на тонкость.При сортировке ожидаемое и наихудшее время составляет O(n^2 log(n))
.С хэшем ваше ожидаемое время составляет O(n^2)
, но теоретически возможно получить O(n^4)
, если ваш алгоритм хеширования выйдет из строя.(Алгоритмы хеширования обычно не ломаются на практике, поэтому мы считаем их O(1)
.)