У меня есть данные, содержащие от миллиона до миллиарда записей, каждая из которых представлена битовым полем, около 64 бит на ключ. Биты независимы, вы можете представить их в основном как случайные биты.
Если у меня есть тестовый ключ, и я хочу найти все значения в моих данных с одним и тем же ключом, хеш-таблица будет легко выплевывать их в O (1).
Какой алгоритм/структура данных будет эффективно искать все записи, наиболее похожие на похожие в ключ запроса? Здесь аналогичное означает, что большинство бит идентичны, но минимальное число допускается неправильно. Это традиционно измеряется расстояние Хэмминга., которое просто подсчитывает количество несогласованных бит.
Можно сделать два способа, чтобы этот запрос мог быть задан, указав скорость несоответствия, например "дайте мне список всех существующих ключей, которые имеют менее 6 бит, которые отличаются от моего запроса", или просто лучшими совпадениями, такими как "дайте мне список из 10 000 ключей, которые имеют самое низкое количество разных бит из моего запроса."
Вам может потребоваться выполнить алгоритмы k-ближайшего соседа, но здесь мы говорим о независимых битах, так что это не так Похоже, что структуры, подобные квадрантам, полезны.
Проблема может быть решена с помощью простого грубого силового тестирования хеш-таблицы для низкого количества бит. Если мы хотим найти все ключи, которые отличаются от одного запроса от нашего запроса, например, мы можем перечислить все 64 возможных ключа и проверить их все. Но это быстро взрывается, если мы хотим разрешить две биты разницы, тогда нам придется прощупывать 64 * 63 = 4032 раза. Он становится экспоненциально хуже для большего количества бит.
Итак, есть ли другая структура данных или стратегия, которая делает этот тип запросов более эффективным? База данных/структура может быть предварительно обработана столько, сколько вам нравится, это скорость запроса, которую следует оптимизировать.