紧凑的 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 效率(特别是考虑到必须在一个节点之间跳转的时间成本)内存中的一堆位置,而不仅仅是能够读取连续的内存块)。