2016-06-23 3 views
1

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

Скажем, у меня есть вход x, который является вектором значений с плавающей запятой, xi = [x_1,x_2,...,x_L]. Размер вектора L. Есть N такие векторы, также называемые примерами, X = [x1,x2,..,x_N]. Учитывая вектор запроса p, мне нужно найти ближайший/ближайший пример, который соответствует запросу. Просматривая несколько материалов для чтения, самая простая (но неэффективная) хеширующая функция - h(x) = x mod M, когда размер таблицы равен M=10 (скажем).

x mod M является остатком x при делении на M, то x mod M всегда будет находиться в диапазоне от 0 и M -1, всегда можно сопоставить целое с одним из M слотов. Мои вопросы:

Вопрос 1: Модуль выполняется по размеру стола. Однако, если каждый образец имеет длину L и есть такие N такие образцы, то какое число по модулю представляет? Будет ли h(x) = x mod vector length

или h(x) = xmod number of examples?

В приложениях для криптографии обычно выполняется мода 256, поскольку каждый блок имеет размер 8 бит. Это означает, что модуль берется по длине вектора? Пожалуйста, исправьте меня, если ошибаетесь.

Вопрос 2: Я должен преобразовать числа с плавающей запятой в целые числа, потому что многие примеры показывают, что вход представляет собой либо значение ASCII, либо целое число.

Вопрос 3: Если для аргументации хэш-функция имеет значение h(x) = 2*x mod 1, то это приведет к получению числа с плавающей запятой в диапазоне [0,1]. Я могу преобразовать его в целое число, используя H(x) = round(h(x)). Для примера сообщения x, если он разделен на k, блокирует каждую длину такой же длины L, мне нужны k такие хэш-функции? Любые предложения для хэш-функции для этого примера. Спасибо.

ответ

0

Итак, когда вы создаете хеш-таблицу, это всего лишь массив, и что делает хэш-функция, требуется ли объект и на основе свойств объектов возвращается integer mod (length of array). Поэтому не беспокойтесь о своих числах с плавающей запятой! Если вы хотите предложить, как это реализовать, вот что я буду делать.

Прежде всего, выясните, как долго вы хотите, чтобы ваша хэш-таблица была (как правило, в два раза больше объектов, которые вы ставите [или немного дольше], это хорошая ставка). Это будет просто массив типа vector (или объект, который вы храните).

Затем вы хотите сделать свою хэш-функцию. При разработке hashfunctions рекомендуется использовать большие простые числа и умножать на них разные части вашего объекта и добавлять все это. Например ...

int total = 0 
for each floatingptNum currentVector: 
    total = total + 129 * currentFloatingptNum 

return total % lengthOfArray 

Это просто очень простой хэш-функции в suedo коде (не уверен, какой язык вы используете), но до тех пор, как он дает вам целое число в диапазоне вы находитесь массива , ты настроен!

Причина, по которой мы используем большие простые числа, заключается в том, что мы получаем как можно меньше столкновений (когда два отдельных значения сопоставляются с одним и тем же местом), но имейте в виду, что они почти всегда должны произойти. Одним из решений является bucket or chain hashing. Это в основном означает, что вместо массива векторов у вас будет массив связанных списков векторов, с единственной целью - хранить два разных вектора в одном и том же месте в хеш-таблице!

Много информации, но я надеюсь, что это поможет! Счастливое хеширование!

+0

Благодарим вас за ответ, однако все еще неясно, касаются операции с модулем и размера стола. Я использую Matlab, и у меня есть база данных объектов. Каждый объект является вектором признаков, массивом длины L. В моем вопросе я сказал, что каждый вектор имеет длину L. Итак, у меня есть матрица, где строки N являются объектами данных (точками данных) и столбцом ach является функцией , Есть L таких столбцов, поэтому длина массива объекта равна L. Итак, будет ли размер таблицы N или L? –

+0

Это было бы не так! Покрутите мою руку, и я скажу размер N для каждого из ваших объектов данных, НО причина, по которой вы хотите, чтобы таблица была длиннее, чтобы избежать столкновения с другими объектами. В вашем столе будут пустые места, и все в порядке, вот как они работают! Но идея состоит в том, чтобы получить какое-либо количество вообще, когда вы хешируете свой объект данных, тем более диким, тем лучше! Как можно более случайным образом, чтобы вы могли использовать оператор modulo с размером вашей таблицы (что-то вроде N * 2), так что независимо от того, насколько сумасшедший ваш номер, вы вернете индекс в диапазоне вашей таблицы , –

+0

Если вы задаетесь вопросом о самом модуле оператора, '500% 11' в основном говорит:« Разделите 500 на 11 столько раз, сколько сможете, и ответ будет тем, что остается, что нельзя разделить », в этом случае 5. Потому что '495/11 = 0', и у нас есть остаток 5! Таким образом, вы можете увидеть это, если ваша длина таблицы равна 11, потому что она всегда дает нам число от 0 до 10 –

Смежные вопросы