Понимание описания Шиены "Хеширования и Струн"
В книге Skiena "Руководство по разработке алгоритмов" на стр. 80 представлен следующий абзац под заголовком 3.7 Хеширование и строки
Пусть α будет размером алфавита, на котором написана данная строка S. Пусть char(c) будет функцией, которая отображает каждый символ алфавита в уникальное целое число от 0 до α - 1.
Что означает "размер алфавита" в вышеприведенном абзаце? Разве все алфавиты (аз) не имеют одинаковый размер? Также как можно написать строку S на алфавите α. Разве алфавиты не собраны вместе, чтобы сформировать строку?
3 ответа
Размер алфавита α означает общее количество символов, которое можно использовать для строки S. В зависимости от ситуации алфавиты могут различаться. Например, двоичные числа могут быть представлены с использованием алфавита {0,1}
(α=2), можно использовать латинские строчные буквы {a,...,z}
(α=26) или символы для представления чисел в шестнадцатеричном формате с использованием {0,...,9,A,...,F}
(Α =16).
Я думаю, вы можете быть смущены тем, что означает "алфавит". Алфавит - это не один символ, а набор всех возможных символов, которые могут появиться в строке. Английский алфавит имеет 26 символов. Еврейский алфавит имеет 22 символа (и они отличаются от английского алфавита).
Я изо всех сил пытался понять эту функцию хеширования, пока не нашел пример ее использования. То, что Скиена описывает, есть вариант алгоритма поиска строк Рабина-Карпа, как описано в Википедии.
Используется функция хеширования:
Позволять
α
быть размер алфавита, на котором данная строкаS
написано. Позволятьchar(c)
быть функцией, которая отображает каждый символ алфавита в уникальное целое число из0
вα − 1
:
Размер α алфавита - это количество символов, которое можно использовать для представления строки S.
Со страницы Википедии, указанной выше:
Отпечаток Рабина рассматривает каждую подстроку как число в некоторой базе, основание обычно представляет собой большое простое число. Например, если подстрока
"hi"
и база101
, значение хеша будет:
104 * 101^1 + 105 * 101^0 = 10609 // (ASCII of 'h' is 104 and of 'i' is 105).
Обратите внимание, что Шиена определяет char()
функционировать как отображение от символа алфавита до целого числа из 0
в α − 1
в то время как в примере из Википедии цифровой код может быть больше размера алфавита, в любом случае это должно дать вам представление о том, как применять формулу.