radix trie with rank / select operations

时间:2014-01-06 09:07:16

标签: algorithm

现在我正在实现一个基数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

感谢〜

1 个答案:

答案 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|)