Теперь я реализую trix (также называемый patricia trie) для индексации отсортированных строк символов. Мне нужна операция rank(), чтобы узнать, сколько узлов существует в левой части совпадающего узла. Более формально,radix trie with rank/select operations
rankT(x) = |{t∈T | t < x}| for T⊆U and x∈U, where T is a radix trie and U is a universe of key.
meaning that calculation of the number of left leaf nodes in the trie.
Например, есть три клавиши, такая, что
key set = {"abc", "def", "ghi"}, and index is 0, 1, 2.
Так что Patricia TRIE хранит эту, как показано ниже:
root
/| \
abc def ghi
и ранг функция() должна return 1, если ключ «def», и 0, если клавиша «abc».
Мой вопрос в том, как эффективно реализовать операцию rank()? Я думаю, что перерасчет ранга узла после каждой вставки неэффективен.
Экспозиция натальной синтаксического дерева, как показано ниже: http://en.wikipedia.org/wiki/Radix_tree
Благодаря ~
Что делать, если я добавлю «be», который имеет ранг 2 после вставки? Как я могу рассчитать ранг ключа x при вставке ключа? –
По мере того, как вы спускаетесь с корня при вставке узла, вы можете рассчитать свой ранг таким же образом, как при подходе к корню из уже вставленного узла.Однако при вставке вам также нужно будет увеличивать число, хранящееся на каждом проходящем вами узле. Вы делаете это, потому что это число представляет слова, заканчивающиеся в поддереве, внедренном на этом узле. Это означает, что при вставке «be» вам нужно будет увеличивать счетчик на узле «b» от 2 до 3. – cyon