检索前缀树(trie)中给定前缀的所有元素的复杂性是多少?

时间:2016-11-01 00:18:27

标签: performance time-complexity trie prefix-tree radix-tree

我知道在trie中搜索给定的前缀是在O(M)中,其中M是插入到trie中的任何单词的最大长度。

但是检索以特定前缀开头的所有元素的时间复杂度是多少?

我想到了一个可能的答案:

O(M + n)其中n是以前缀开头的单词数。想法:搜索前缀是O(M)。然后我有一个子集,其中包含以给定前缀开头的所有单词,我只需要遍历它。问题(可能):前缀树中的节点多于单词。但也许有某种形式的有效存储,所以我不必看它们?

1 个答案:

答案 0 :(得分:0)

想象一下,你有一个trie,其中所有单词都以相同的长度L开头。现在,报告以该前缀开头的所有单词需要你对trie进行完整的搜索,这需要花费时间O(n),其中n是特里结构中的节点总数。

这里的挑战是,搜索以某些前缀开头的trie中的所有单词可能需要您搜索与前缀长度无关的多个节点。这取决于trie中的节点。

如果您知道自己会经常进行此类搜索,则可能需要考虑使用Patricia trie(也称为radix trie)。这是一个特里,其中每个边可以用多个字符标记,并且不允许有一个子节点和一个父节点的节点。如果以这种方式存储trie,则可以显示访问与特定子块中的单词对应的所有节点所需的时间是O(z),其中z是找到的单词数。这样做的原因是Patricia trie中的每个非叶子节点至少有两个子节点,因此包含z叶子节点的子节点将具有z个内部节点(这是一个很好的练习来检查这个),所以你可以发现刚刚扫描O(z)节点后的所有叶子。问题是,这将找到单词的节点,而不是列出单词本身。如果您对此感到满意,这可以节省大量时间。