【问题标题】:How can a compact trie be beneficial?紧凑的 trie 有什么好处?
【发布时间】:2018-10-12 08:51:23
【问题描述】:
我刚刚了解到,与常规 trie 相比,紧凑型 trie 可以节省更多内存,方法是存储 3 个整数作为对字符串对象的引用,而不是在每个节点中实际存储一个字符串。但是,我仍然对它如何使用该方法实际节省内存感到困惑。
如果在紧凑树的一个节点中,我们存储了 3 个整数和一个对 String 对象的引用,如果该 String 对象也存储在内存中,那会不会节省任何内存?
如果是这种情况,是否只有当我们将 String 对象存储在磁盘上时,compact trie 才有用。
【问题讨论】:
标签:
memory-management
data-structures
trie
【解决方案1】:
如果您已经出于其他目的存储字符串,则压缩 trie 的紧凑存储可以更节省空间。
如果您还计算字符串的存储量,则紧凑和非紧凑版本的内存使用情况相似。紧凑的版本可能更糟,这取决于您的整数和指针需要多少字节。
对于非紧凑压缩树:
对于紧凑的压缩树:
- 每个节点将有 3 个整数(每个 2 个字节)。这给了我们 6 个字节。
- 如果我们还要计算存储字符串,除了这些字符串的开销(指针和长度)之外,我们还有实际的字符串(与上述相同)。
- 考虑到这些数字(如果我们计算存储字符串),这个版本会更糟。
对于未压缩的 trie:(即每个节点只存储一个字符)
- 每个节点直接存储一个字符。
- 不会有字符串开销。
- 但是,如果您的链很长,则可以使用这种表示形式拥有更多节点,因此最终可能会降低时间和空间效率(尤其是考虑到必须在内存中的一堆位置之间跳转的时间成本只是能够读取一个连续的内存块)。
【讨论】:
-
紧凑 trie,我指的是使用 3 个整数表示字符串的尝试,例如 this one。我认为你不是在谈论他们。