关于PATRICIA的困惑

时间:2013-04-09 06:37:17

标签: data-structures patricia-trie

根据libstdc++ documentation的第3点和第4点,PATRICIA尝试有两种类型的节点:

  

(PATRICIA)trie类似于树,但具有以下内容   差异:

     
      
  1. 它明确地将键视为一系列元素。例如,trie可以将字符串视为一系列字符;特里可以查看   数字作为比特序列。

  2.   
  3. 它不一定是二进制的。每个节点都有扇出n + 1,其中n是不同元素的数量。

  4.   
  5. 它仅在叶节点上存储值。

  6.   
  7. 内部节点具有A)每个至少有两个子节点的属性,B)每个节点与其任何一个子节点共享相同的前缀   后代。

  8.   

我一直在阅读的书(C中的算法,Robert Sedgewick的第1-4部分)似乎描述了一个PATRICIA trie,它只用n个节点存储n个值,使用内部节点来存储值:

  

与DST一样,patricia尝试只允许在树中搜索N个键   N个节点。 ...我们通过另一个简单的设备避免外部节点:我们   将数据存储在内部节点中,并用。替换外部节点的链接   链接指向回到trie中正确的内部节点

这里似乎有两个信仰阵营:

  1. 一方面,我们有一个严格的,具体的定义(即Sedgewick,Knuth,Morrison,他们似乎都将PATRICIA专门描述为一个前缀压缩的二叉树,单向分支被淘汰);和
  2. 然后我们让那些人相信这个术语形成一个松散的,模糊的定义,似乎更像是他们想要使用像“map”,“dictionary”或“trie”这样的词(它们都是松散定义的,即libcs​​td ++文档)。
  3. 我想我担心资源的准确性。据我所知,由于公共前缀引入的问题,不可能只用N个节点表示一个树而不将其表示为二叉树(这似乎违反了libcs​​td ++ docs的第2点,而在处理变量时则指向第4点) -width keys),并且不会失去严格的单向分支的概念(通过使“叶子节点”和“子节点”的概念有些无效而违反第3点和第4点)。这两个功能协同工作,消除了“内部节点”的困境,导致这些树使用超过N个节点(召回:N个项目只有N个节点)。

    这两组参考文献不能同时正确;相互排斥太多了。如果一个参考文献说PATRICIA是二元的而另一个说它可能不是,那么它们不能被认为是事实上正确的,这只是我在这里看到的不一致的一个例子。哪些参考文献是正确的?

2 个答案:

答案 0 :(得分:5)

我继续从过去的信誉来源中寻找一个具体的定义,以确认我所怀疑的内容,并且我写信是为了提供我的发现。也许最重要的是定义PATRICIA的官方文件,由DR Morrison于1968年10月出版的“ACM杂志”:

  

PATRICIA从“A Library Automaton”[3]和其他研究发展而来。 ...   在这个演变的早期,决定字母应该是   限制为二进制。一个强烈影响这一定理的定理   决定是以另一种形式归因于欧拉的决定。定理   说如果字母表是二进制的,那么分支的数量是   正好少于两端的数量。推论说,as   随着图书馆的发展,每个新的结尾都会带入图书馆   正好是一个新的分支,每个分支都有两个出口。这些   事实在索引的存储分配中非常有用。他们   意味着所需的总存储量完全取决于   结束次数,实际使用所需的所有存储空间。

这肯定与libstdc ++参考文献的第2点和第3点相矛盾。本文还有其他证据,例如具体的算法细节,但上面的引用应该足够了。

然而,Sedgewick报价中的官方描述似乎没有任何偏差。基于此,libstdc ++资源肯定不如Sedgewick资源有效。

答案 1 :(得分:1)

虽然两个定义似乎都是正确的,但第一个定义更详细,对我来说似乎更好。另请查看this answer,我试图描绘Patricia和普通Trie之间的区别。