Поиск в локальном хешировании

Я пытаюсь понять раздел 5. изЭта бумага о LSH, в частности, как создать сгенерированные хэши. Цитирую связанный документ:

Учитывая битовые векторы, состоящие из d битов каждый, мы выбираем N = O (n 1 / (1 + epsilon)) случайных перестановок битов. Для каждой случайной перестановки σ мы поддерживаем отсортированный порядок O σ битовых векторов в лексикографическом порядке битов, переставляемых σ. Для заданного вектора битов запроса q мы находим приблизительного ближайшего соседа, выполняя следующее: Для каждой перестановки σ мы выполняем двоичный поиск по O σ, чтобы найти два битовых вектора, ближайших к q (в лексикографическом порядке, полученном битами, переставленными σ). Теперь мы ищем в каждом из отсортированных порядков O σ, исследуя элементы выше и ниже позиции, возвращаемой двоичным поиском, в порядке длины самого длинного префикса, соответствующего q. Это можно сделать, поддерживая два указателя для каждого отсортированного порядка O σ (один перемещается вверх, а другой - вниз). На каждом шаге мы перемещаем один из указателей вверх или вниз, соответствующий элементу с самым длинным совпадающим префиксом. (Здесь длина самого длинного совпадающего префикса в O σ вычисляется относительно q с его битами, переставленными σ). Таким образом, мы исследуем 2N = O (n 1 / (1 + эпсилон)) битовых векторов. Из всех рассмотренных битовых векторов мы возвращаем тот, который имеет наименьшее расстояние Хемминга, к q.

Я запутался в этом алгоритме и не думаю, что понял, как он работает.

Я уже нашелэтот вопрос по теме, но я не понял ответ в комментариях. Также вэтот В пункте 2 описан тот же алгоритм, но опять же, я не понимаю, как он работает.

Не могли бы вы попытаться объяснить мне, как это работает, шаг за шагом, пытаясь быть как можно более простым?

Я даже пытался составить список вещей, которые я не понимаю, но на практике написано так плохо, что я не понимаю большинство предложений!

РЕДАКТИРОВАТЬ после gsamaras ответ:

Я в основном понял ответ, но у меня все еще есть некоторые сомнения:

Правильно ли говорить, что общая стоимость выполненияN перестановкиO(Nnlogn), так как мы должны отсортировать каждого из них?

Процесс перестановки + сортировки, описанный выше, выполняется только один раз во время предварительной обработки или длякаждый запросq? Кажется уже довольно дорогоO(Nnlogn) даже при предварительной обработке, если мы должны сделать это во время запроса, это катастрофа: D

В последний момент, где мы сравниваемv0 а такжеv4 вq, мы сравниваем их перестановочную версию или оригинальную (до их перестановки)?

Ответы на вопрос(1)

Ваш ответ на вопрос