现在我正在实现一个基数trie(也称为patricia trie)来索引排序的字符串。 所以我需要一个rank()操作来知道匹配节点左边有多少个节点。 更正式的,
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
如果key为“def”,则rank()函数应返回1,如果key为“abc”,则返回0。
我的问题是如何有效地实现rank()操作?我认为每次插入后重新计算节点的等级是低效的。
radix trie的阐述如下: http://en.wikipedia.org/wiki/Radix_tree
感谢〜
答案 0 :(得分:4)
为了能够快速插入单词并计算排名,您可以存储一个表示每个节点上子树中单词数的值。然后,当查询排名时,您可以从叶节点x
向上移动到累积rank(x)
因此,例如,您可以使用单词“a”,“bcd”,“bg”和“def”中的基数特里(字母中的数字是子树中的单词数)
root
/ | \
a(1) | def(1)
b(2)
/ \
cd(1) g(1)
找到单词“bg”的rank()
。你从节点g(1)
开始,然后你上去:
b(2)
处,您将累积g(1)
左侧所有子树的值。设置等级(bg)=大小(cd)root
处,您将累积b(2)
左侧所有子树的值。所以
rank(bg)= size(cd)+ size(a)= 1 + 1 = 2 查找单词“def”的rank()
root
处,您将累积def(1)
左侧所有子树的值。所以
rank(def)= size(a)+ size(b)= 2 + 1 = 3 就运行时而言:对于字符串x
,您可以通过低级len(x)
父节点。在每个节点,最多只有|A|
个孩子,其中A
是您的字母。所以运行时将是O(len(x) * |A|)