根据libstdc++ 文档的第 3 点和第 4 点,PATRICIA 尝试有两种类型的节点:
(PATRICIA) trie 类似于树,但有以下区别:
它明确地将键视为一系列元素。例如,trie 可以将字符串视为字符序列;trie 可以将数字视为位序列。
它不是(必然)二进制。每个节点都有 n + 1 个扇出,其中 n 是不同元素的数量。
它仅在叶节点存储值。
内部节点具有以下属性:A)每个都至少有两个子节点,B)每个节点都与其任何后代共享相同的前缀。
我一直在阅读的书(Algorithms in C, Parts 1-4 by Robert Sedgewick)似乎描述了一个 PATRICIA trie,它只使用 n 个节点存储 n 个值,使用内部节点来存储值:
与 DST 一样,patricia 尝试允许在只有 N 个节点的树中搜索 N 个键。...我们通过另一个简单的设备避免外部节点:我们将数据存储在内部节点中,并将指向外部节点的链接替换为指向树中正确内部节点的链接
这里似乎有两个信仰阵营:
- 一方面,我们有一个严格、具体的定义(即 Sedgewick、Knuth、Morrison,他们似乎都将 PATRICIA 专门描述为一棵消除了单向分支的前缀压缩二叉树);和
- 然后我们有一些人认为该术语形成了一个松散、模糊的定义,这似乎更像是他们的意思是使用像“map”、“dictionary”或“trie”这样的词(这些实际上都是松散定义的,即 libcstd++ 文档)。
我想我担心我的资源的准确性。据我了解,由于常见前缀引入的问题,不可能在不将其呈现为二叉树的情况下表示只有 N 个节点的树(这似乎违反了 libcstd++ 文档的第 2 点,以及处理变量时的第 4 点-width 键),并且不失严格单向分支的概念(违反第 3 点和第 4 点,使“叶节点”和“子节点”的概念有些无效)。这两个功能协同工作以消除“内部节点”的困境,这将导致此类树使用超过 N 个节点(回想一下:N 个项目与 N 个节点)。
这两组参考文献不可能都正确;有太多的相互排斥。如果一个参考说 PATRICIA 是二元的,另一个说它可能不是,它们不能都被认为是事实正确的,这只是我在这里看到的不一致的一个例子。这些引用中哪些是正确的?