Я реализую Minimalistic Acyclic Finite State Automaton (MA-FSA, определенный тип DAG) в Go и хотел бы связать некоторые дополнительные данные с узлами, которые указывают EOW (конец слова). С MA-FSA традиционный подход невозможен, поскольку на этом узле может быть несколько слов. Поэтому я рассматриваю минимальные совершенные хэширующие функции в качестве альтернативы.В этой минимальной идеальной хеширующей функции, что подразумевается под FirstLetter и Предшественником?
В поле «Коррекция» в верхней части his blog post, Steve Hanov указано, что он использовал метод, описанный в this paper by Lucchesi and Kowaltowski. При взгляде на Рисунок 12 (стр. 19) описывает функцию хэширования.
В строке 8 он относится к FirstLetter
и Predecessor()
, но он не описывает, что они собой представляют. Или я этого не вижу. Кто они такие?
Все, что я могу понять, это то, что он просто пересекает дерево, добавляя Number
от каждого узла, когда он идет, но это, возможно, не так. Он создает слишком большие числа, и это не одно к одному, как говорится в документе. Я что-то неправильно понял?
интересная идея; поэтому на каждом узле мы итерации букв алфавита лексикографически перед буквой, в которой мы сейчас находимся, и добавляем их числа тоже? Я обдумаю это, но с самого начала это тоже не имеет большого смысла. – Matt
«Предположим, что представление нашего автомата включает в себя: для каждое состояние, целое число, которое дает количество слов, которое будет , принятое автоматом, начиная с этого состояния». – user4203646
Подумайте об этом так: перечислите все принятые слова. Сортируйте их. Найдите свое слово в списке. Его индекс - это хеш-значение слова. – user4203646