Один из подходов - Хеширование с учетом локальных особенностей
Во-первых, вы должны заметить, что этот метод не обязательно возвращает все пары, он возвращает все пары с высокой вероятностью (или большинство пар).
Локализация, чувствительная к локальности, может быть суммирована следующим образом: точки данных, которые расположены близко друг к другу, отображаются в аналогичные хеши (в том же сегменте с высокой вероятностью). Проверьте эту ссылку для более подробной информации.
Ваша проблема может быть математически преобразована как:
С учетом N
векторов v ∈ R^{24}, N<<5^24
и максимального расстояния Хэмминга d
, возвратите пары, у которых расстояние Хемминга не более d
.
Способ решения этой проблемы заключается в случайном генерировании K
самолетов {P_1,P_2,...,P_K}
в R^{24}
; Где K
- параметр, с которым вам придется поэкспериментировать. Для каждой точки данных v
вы определите хеш v
как кортеж Hash(v)=(a_1,a_2,...,a_K)
, где a_i∈{0,1}
обозначает, находится ли v
над этой плоскостью или под ней. Вы можете доказать (я опущу доказательство), что если расстояние Хемминга между двумя векторами мало, то вероятность того, что их хэш близок, высока.
Таким образом, для любой заданной точки данных вместо проверки всех точек данных в последовательностях вы проверяете только точки данных в ячейке «закрытых» хэшей.
Обратите внимание, что они основаны на эвристике, и вам нужно будет поэкспериментировать с K
и тем, насколько «близко» вы хотите искать по каждому хешу. При увеличении K
количество ваших бинов увеличивается экспоненциально, но вероятность подобия увеличивается.
Судя по тому, что вы сказали, похоже, у вас есть гигантский набор данных, поэтому я подумал, что выкину это, чтобы вы подумали.