Trie节省了空间,但如何做到呢?

2022-09-03 18:10:55

我对Trie实现如何节省空间并以最紧凑的形式存储数据感到困惑!

如果你看看下面的树。当你在任何节点上存储一个字符时,你还需要存储对该字符的引用,因此对于字符串的每个字符,你需要存储它的引用。好的,当一个公共字符到达时,我们节省了一些空间,但是我们在存储对该字符节点的引用时丢失了更多空间。

那么,不是有很多结构开销来维护这棵树本身吗?相反,如果使用TreeMap代替它,比如说实现字典,这可以节省更多的空间,因为字符串将保存在一个片段中,因此在存储引用时不会浪费空间,不是吗?

enter image description here


答案 1

为了在使用trie时节省空间,可以使用压缩的trie(也称为patricia trie或radix树),其中一个节点可以表示多个字符:

在计算机科学中,基数树(也称为patricia trie或radix trie)是一种空间优化的trie数据结构,其中只有一个子节点的每个节点都与其子节点合并。结果是每个内部节点至少有两个子节点。与常规尝试不同,边缘可以用字符序列和单个字符进行标记。这使得它们对于小集合(特别是如果字符串很长)和共享长前缀的字符串集更有效。

基数树示例:

radix tree or patricia trie

请注意,trie 通常用作一组字符串的前缀匹配的有效数据结构。trie也可以用作关联数组(如哈希表),其中键是字符串。


答案 2

当您有大量单词要由树表示时,可以节省空间。因为许多单词在树中共享相同的路径;您拥有的单词越多,节省的空间就越多。

但是,如果您想节省空间,则可以使用更好的数据结构。Trie不像有向无环字图(DAWG)那样节省空间,因为它在整个结构中共享公共节点,而trie不共享节点。维基条目解释了这么多细节,所以看看它。

以下是Trie和DAWG之间的区别(图形上):

enter image description here

字符串“tap”,“taps”,“top”和“tops”存储在Trie(左)和DAWG(右)中,EOW代表词尾。

左边的树是Trie,右边的树是DAWG。比较它们,看看 DAWG 如何有效地节省空间。Trie具有表示相同字母/子词的重复节点,而DAWG的每个字母/子词正好有一个节点。