Найти все пары значений, которые находятся под расстоянием Хэмминга

11

У меня есть несколько миллионов 32-битных значений. Для каждого значения я хочу найти все другие значения в пределах расстояния Хэмминга, равного 5. В наивном подходе это требует сравнений, которых я хочу избежать.O(N2)

Я понял, что если я просто обработал эти 32-битные значения как целые числа и отсортировал список один раз, то значения, которые отличались только младшими значащими битами, оказались очень близко друг к другу. Это позволяет мне иметь более короткое «окно» или диапазон чисел, в которых я могу выполнять фактические попарные сравнения для точного расстояния Хэмминга. Однако когда значения 2 изменяются только в битах более высокого порядка, они оказываются за пределами этого «окна» и появляются на противоположных концах отсортированного списка. Например

11010010101001110001111001010110

01010010101001110001111001010110

было бы очень далеко друг от друга, даже если их расстояние Хэмминга равно 1. Поскольку расстояние Хемминга между двумя значениями сохраняется при повороте обоих, я подумал, что, выполнив 32 поворота влево и затем сортируя список каждый раз, вполне вероятно, что 2 значения окажется достаточно близко в отсортированном списке хотя бы в одном из них.

  1. Хотя этот подход дает мне хорошие результаты, я изо всех сил пытаюсь официально установить правильность этого подхода.

  2. Учитывая, что я ищу совпадающие значения с расстоянием Хэмминга или меньше, мне действительно нужно делать все 32-битные вращения? Например, если k = 1, а размер моего окна равен 1000, мне нужно делать это при максимальных 24-битных поворотах, потому что даже если бит сбоя появился в любом из 8 младших битов, результирующие числа не будут отличаться более чем на 1000.kk=1

karterk
источник
Просто идеи от 20 секунд размышлений: как насчет сортировки по Грею-Коду? Как насчет разделения списка 32-битных растровых изображений на четыре списка 8-разрядных растровых изображений и последующего использования вашей техники?
Карл Дамгаард Асмуссен
1
Не могли бы вы быть более точным в отношении очень большого количества растровых изображений? Это близко к , 2 30 или как? 220230
минар
@minar: у меня 3-4 миллиона таких 32-битных растровых изображений.
karterk
Я не уверен, что вы спрашиваете. Вы говорите, что у вас есть массив из 32-буквенных логических строк (большой, но не содержащий всех 4 × 10 9 возможных строк), и вы хотите пометить пары, которые имеют расстояние Хэмминга не более 5 в некотором роде, возможно, путем создания связанного списка индексов близких соседей для каждой строки я ? A[i]4×109A[i].closei
Андрас Саламон
думаю, что есть аналогичное понятие "квадродерев", за исключением применимых гиперкубов. алгоритм находит и рекурсивно находит векторы в гиперкубах, а затем, когда вы хотите искать «соседние» битовые векторы, вы будете искать только «близлежащие» гиперкубы. подозреваю, что это может быть изучено и где-то в статье .... не уверен в правильных условиях ....
vzn

Ответы:

9

Как уже говорилось, ваш подход проблематичен, потому что если 2 битовых карты имеют равномерно распределенные различия, то при любом повороте будут различия в некоторых старших битах.

51/5064NN222

45529N4960N


Дополнительная информация:

  1. 51632
    (165)(325)0.0217
  2. Построение списков для каждого элемента в исходном списке помещается в расширенный список: сам элемент, все элементы, различающиеся в одной позиции, и все элементы, различающиеся в двух позициях (сохраняя информацию об исходном элементе). Количество копий для каждого элемента:Любое столкновение в этом списке (обнаруженное после сортировки) соответствует двум исходным элементам на расстоянии не более . Обратите внимание, что каждую пару можно обнаружить несколько раз, поэтому вам нужно будет удалить дубликаты (но это уже имело место в вашем первоначальном алгоритме).41+32+(322)=529.4
  3. Для последнего прохода предпочтительно сокращать расширенный список элементов, чтобы сохранить только те элементы, которые находятся на точном расстоянии от их исходного элемента. Затем для каждого исходного элемента создайте элементы на расстоянии и найдите их в расширенном списке. Еще раз, вам нужно удалить дубликаты, так как каждая пара будет обнаружена раз. [С особой осторожностью вы, вероятно, можете ожидать / избегать большинства дубликатов, но я не уверен, стоит ли это усилий.]( 3223 ( 5(323)=49603(53)=10
Минар
источник
Что касается первого подхода, вы хотите сказать, что я переставляю растровое изображение в некоторых заранее определенных порядках вместо того, чтобы просто вращать бит? Не могли бы вы объяснить, как вы получили вероятность 1/50? Кроме того, для второго подхода, нужно ли мне сначала создать индекс моего списка, а затем для каждого элемента - сгенерировать (32C1 + 32C2) комбинации и сравнить их с этим индексом, чтобы идентифицировать все битовые карты, различающиеся на расстоянии 2? Было бы здорово, если бы вы могли объяснить это дальше. Спасибо.
karterk
5

Ответ Минара превосходен и, вероятно, является правильным подходом для решения этой конкретной проблемы. Однако я упомяну еще один возможный подход:

Вы можете использовать хеш-функцию, чувствительную к локальности (LSH). Чувствительная к локальности хеш-функция разработана так, что если близки на расстоянии Хэмминга, то . Если у вас есть такой хэш , вы можете сохранить все свои значения в хеш-таблице (используя хэш-функцию и открытое хеширование), и тогда вы очень быстро сможете найти все пары значений, которые находятся близко на расстоянии Хэмминга. , Существуют различные методы построения LSH; Вы можете посмотреть ссылки на эту тему, чтобы найти несколько кандидатов.x , y H ( x ) = H ( y ) H HHx,yH(x)=H(y)HH

Тем не менее, для вашей конкретной проблемы (с конкретными параметрами, которые вы упомянули), я ожидаю, что два алгоритма Минара окажутся лучше на практике, чем любая схема на основе LSH. Я упоминаю об этом только в случае, если другие читатели придут сюда на этот вопрос с похожей проблемой, но с другими параметрами, где LSH может иметь больше смысла.

DW
источник