我试图理解the radix tree (or compact prefix tree) data structure。
我理解查找,插入和删除如何使用它。但我无法理解radix在基数树中的含义。
基数的目的是什么?
答案 0 :(得分:1)
Wikipedia上有一些信息:
结果是每个内部节点最多具有基数trie的基数r的子节点数,其中r是正整数,幂x是2,x≥1。
因此,radix表示每个内部节点的子节点数,并且该数字必须是2的幂。当基数为2时,我们有一个熟悉的二叉树。
答案 1 :(得分:1)
正如Wikipedia etymology link中@ta已经提到的那样,' radix'是你的特里的基础。在这种情况下,我们指的是数字基础,我们将考虑存储二进制数据。基数R = 2 ^ x,其中x> = 1.
以二元(2-ary)trie为例。基数为2,因此在每个节点上您可以比较一位。这两个孩子将处理所有可能的结果:
下一级别的复杂性将是4-ary trie。正如@Garrett上面提到的,基数必须是2的幂,这样它总能处理我们用它的二进制数据的所有可能的排序结果。 4-ary trie可以将两个二进制位与四种可能的结果进行比较:
这四个选项分别导致不同的子节点。
现在,回答你关于英文字母的基数的问题。你想要编码从a到z(26个字母)的字母,所以需要有一个至少2 ^ 5 = 32的基数。这是你可以在每个字母之间切换并符合'的最小基数。两个人的权力规则。 2 ^ 4 = 16不会处理所有字母。
例如,让我们想象以下编码:
我们现在可以在树中的每个节点处对五位进行比较,因此每个节点现在可以在任何罗马字母字母之间切换。如果你想要一个处理大写字母的trie,那么你需要一个更大的基数。 2 ^ 6的基数将足以让你做到这一点,但它的代价是在trie中浪费更多的空间(未使用的分支)。
进一步阅读:Sedgewick, Ch 15.4, on Multiway Tries。 Algorithms by Cormen的第3版通常非常出色,但对多路尝试没有太大作用。
答案 2 :(得分:1)
我已将此答案发布为对另一个帖子的回复 - What is the difference between trie and radix trie data structures?。特别是 Radix Trie 和 Trie这些可能不是Radix Trie 的部分可能对这个问题特别感兴趣。