Я работаю над разработкой стратегии индексирования для поиска похожих хэшей. Хеши генерируются для изображений. т.е.Стратегия индексирования для поиска похожих строк
String A = "00007c3fff1f3b06738f390079c627c3ffe3fb11f0007c00fff07ff03f003000" //Image 1
String B = "6000fc3efb1f1b06638f1b0071c667c7fff3e738d0007c00fff03ff03f803000" //Image 2
Эти два хешей подобны (на основе расстояния Хемминга и Левенштейна расстояния) и, следовательно, подобных изображений. У меня более 190 миллионов таких хэшей. Я должен выбрать подходящую структуру данных индексирования, где сложность худшего случая для поиска аналогичного хеша не является O (n). Хэш-структура данных не будет работать, потому что она будет искать <, = и> (или будет?). Я могу найти расстояние Хэмминга или другое расстояние, чтобы рассчитать сходство, но в худшем случае я в конечном итоге вычислил его в 190 миллионов раз.
Это моя стратегия в настоящее время:
В настоящее время я работаю над BTree, где я буду ранжировать все ключи в узле не на основе не. из последовательных одинаковых символов и пересечь ключ, который имеет наивысший рейтинг, и если ранжирование ключей ребенка меньше, чем ранг другого ключа в родительском узле, я начну обходить этот ключ в родительском узле. Если весь ранг родительского элемента будет таким же, я сделаю обычный траверс BTree (givenkey < nodeKey -> перейти к дочернему узлу nodeKey..используя сравнение ASCII), где моя проблема.
Потому что это приведет к множеству ложных негативов в поиске. Как и в худшем случае, я пройду только одну часть дерева, где потенциально подобный ключ можно найти в других проходах. Иначе я должен искать целые деревья, которые снова O (n), где я мог бы также не иметь дерева.
Я чувствую, что должен быть лучший способ, и прямо сейчас я застрял, и было бы здорово услышать какие-либо входы при разрушении проблемы. Пожалуйста, поделитесь своими мыслями.
P.S: и я не могу использовать внешнюю базу данных.
Итак, вам нужна строка, вы хотите найти ближайшую к ней базу данных 190M с точки зрения расстояния Хэмминга? – kangshiyin
Не только расстояние от помех, это может быть любая техника.Я хочу найти похожие строки, не проходя через все строки, чтобы сказать, что очень похоже. – Anandan
Любая техника, о которой я могу думать, требует проверки всех остальных строк на предмет сходства. Но я хочу иметь технику, где, если строки структурированы каким-то образом, вы не хотите проходить путь, где вы очень хорошо знаете, что подобная строка не будет. Поскольку все эти хэши хранятся на диске, и я не могу позволить себе это, что может читать диски. Я знаю, что есть стратегии, такие как их zipping и их получение (чтобы использовать большую часть одного диска), так что сравнение всех 190 М становится сравнительно быстрым. Но я хочу оптимизировать это сравнение. – Anandan