Trie是K-ary树吗?

时间:2014-01-10 04:07:44

标签: c++ algorithm data-structures tree trie

如果你看一个简单的Trie和一个简单的K-ary树的节点定义,它们看起来是一样的。

(使用C ++表示法)

template <size_t K>
trieNode
{
    trieNode *[K]
};

template <size_t K>
KaryNode
{
    KaryNode *[K]
};

最简单的一个K-ary树每个节点有多个子节点(二叉树为2个)

特里有“每个节点多个孩子”

似乎K-ary树根据Keys的比较(&lt;或&gt;)来选择孩子

虽然Trie根据Key的子跨度(一元)平等使其选择了孩子

由于数据结构都没有进入任何标准,每种标准的最佳定义是什么,以及它们将如何区分?

4 个答案:

答案 0 :(得分:4)

从数据结构的 shape 的角度来看,trie显然是一个N-ary树,就像平衡二叉搜索树是二叉树一样,区别在于数据结构如何管理数据。

二进制搜索树是一个二叉树,其附加约束条件是节点中的键是有序的,平衡二叉树在其上添加了对不同分支长度之间差异的约束。

类似地,trie是一个N-ary树,其中包含确定密钥管理方式的附加约束。


让我们尝试一下trie的定义:

trie是一种有效的数据结构,用于实现字典,其中键是按字典顺序排列的。该实现使用N-ary树,其中分支因子是密钥序列 [1] 中每个元素的有效值范围,并且每个节点可能保持或不保持值,但始终保持子序列密钥存储 [2] 。对于树中的每个节点,存储在从根到任何给定节点的节点中的密钥的子序列的串联表示存储的值的密钥,如果节点保持值,和/或所有节点的公共前缀。这个子树。

这种数据布局允许对键的大小进行线性查找,并且共享前缀允许对许多自然语言进行紧凑表示(例如西班牙语,其中每个动词的不同形式仅在最后几个后缀字符上不同)。

1 :密钥是序列是一个重要的前提,因为尝试的主要优点是它们将密钥分割成沿路径的不同节点。

2 :根据实现情况,每个节点可能会保留序列或组合中的单个元素(字符)。

答案 1 :(得分:2)

二叉树指的是树的形状,而没有说明如何使用树。二叉搜索树是以特定方式使用的二叉树。

类似地,k-ary树= n-ary tree =多路树指的是树的形状。特里是一种以特定方式使用的多路树。

(但是,请注意,就像二元搜索树上有很多变化一样,尝试时会有很多不同的变化。)

那么,是什么让特里成为特里?

trie通常用于表示序列的集合,例如字符串。存储特定密钥,而不是像二进制搜索树中那样存储在单个节点中,而是分散在树的多个级别上。这是一张包含字符串“can”,“car”,“cat”和“do”的trie图片。

        .
       / \
     c/   \d
     /     \
    .       .
    |       |
   a|       |o
    |       |
    .       .
   /|\
 n/r| \t
 /  |  \
.   .   .

正如您所看到的,可能更容易将字符视为与边缘而不是节点相关联,但任何特定的实现都可能代表它。

许多种类的尝试都有所不同,例如它们如何处理一个键是另一个键的前缀(例如,“cat”和“catastrophe”)的情况,以及如何/是否压缩长公共子串。

答案 2 :(得分:0)

K-nary tree:每个节点最多有K个孩子。 Trie:每个节点的子节点不限于一个数字(理论上)。在实践中,当然总有一个限制。例如,对于亚洲单词trie,每个节点的子节点数限制为亚洲字符的大小,可能是5000或10000。

答案 3 :(得分:0)

感谢user534498对Knuth的“Taocp第3卷第6.2章及6.3”的评论

Knuth声称 - 第6.3章

  

trie本质上是一个M-ary树,其节点是M-place向量   与数字或字符对应的组件。每个节点上   level l 表示以某个开头的所有键的集合    l 字符序列;节点指定M路分支,   取决于( l +1)st字符。

K-ary,M-ary和N-ary是同义词,似乎答案是