紧凑的 trie 有什么好处?
How can a compact trie be beneficial?
我刚刚了解到,通过存储 3 个整数作为对字符串对象的引用,而不是在每个节点中实际存储一个字符串,与常规 trie 相比,紧凑型 trie 可以节省更多内存。但是,我仍然对它如何使用该方法实际节省内存感到困惑。
如果在紧凑型 trie 的节点中,我们存储 3 个整数和对 String 对象的引用,如果该 String 对象也存储在内存中,那是否根本不节省任何内存?
如果是这种情况,紧凑型 trie 是否仅在我们将 String 对象存储在磁盘上时才有用。
如果您已经出于其他目的存储字符串,压缩的 trie 树的紧凑存储可能会更 space 高效。
如果您还对字符串的存储进行计数,则紧凑型和非紧凑型版本的内存使用情况相似。紧凑版本可能更糟,具体取决于您的整数和指针需要多少字节。
对于非压缩压缩特里树:
每个节点都有一个字符串,它需要一个指针(比如说 4 个字节)和一个长度(2 个字节)。这给了我们 6 个字节。
除此之外,我们还需要存储实际的字符串(即使我们已经将它们存储在别处)。
对于紧凑压缩的 trie:
- 每个节点将有 3 个整数(每个 2 个字节)。这给了我们 6 个字节。
- 如果我们也计算存储字符串,除了这些字符串的开销(指针和长度)之外,我们还有实际的字符串(与上面相同)。
- 鉴于这些数字(如果我们计算存储字符串),这个版本会更糟。
对于非压缩的 trie:(即每个节点只存储一个字符)
- 每个节点直接存储一个字符。
- 不会有字符串开销。
- 然而,如果你有长链,你可以有更多的节点具有这种表示,因此这最终可能会花费更少的时间和 space 效率(特别是考虑到必须在一个节点之间跳转的时间成本)内存中的一堆位置,而不仅仅是能够读取连续的内存块)。
我刚刚了解到,通过存储 3 个整数作为对字符串对象的引用,而不是在每个节点中实际存储一个字符串,与常规 trie 相比,紧凑型 trie 可以节省更多内存。但是,我仍然对它如何使用该方法实际节省内存感到困惑。
如果在紧凑型 trie 的节点中,我们存储 3 个整数和对 String 对象的引用,如果该 String 对象也存储在内存中,那是否根本不节省任何内存?
如果是这种情况,紧凑型 trie 是否仅在我们将 String 对象存储在磁盘上时才有用。
如果您已经出于其他目的存储字符串,压缩的 trie 树的紧凑存储可能会更 space 高效。
如果您还对字符串的存储进行计数,则紧凑型和非紧凑型版本的内存使用情况相似。紧凑版本可能更糟,具体取决于您的整数和指针需要多少字节。
对于非压缩压缩特里树:
每个节点都有一个字符串,它需要一个指针(比如说 4 个字节)和一个长度(2 个字节)。这给了我们 6 个字节。
除此之外,我们还需要存储实际的字符串(即使我们已经将它们存储在别处)。
对于紧凑压缩的 trie:
- 每个节点将有 3 个整数(每个 2 个字节)。这给了我们 6 个字节。
- 如果我们也计算存储字符串,除了这些字符串的开销(指针和长度)之外,我们还有实际的字符串(与上面相同)。
- 鉴于这些数字(如果我们计算存储字符串),这个版本会更糟。
对于非压缩的 trie:(即每个节点只存储一个字符)
- 每个节点直接存储一个字符。
- 不会有字符串开销。
- 然而,如果你有长链,你可以有更多的节点具有这种表示,因此这最终可能会花费更少的时间和 space 效率(特别是考虑到必须在一个节点之间跳转的时间成本)内存中的一堆位置,而不仅仅是能够读取连续的内存块)。