【问题标题】:Why aren't C++ maps implemented as tries?为什么 C++ 映射不作为尝试实现?
【发布时间】:2012-02-14 21:40:59
【问题描述】:

Tries 是非常快的数据结构。查找一个单词需要 O(sizeofword) 时间,而 std::maps 是自平衡树。为什么标准的 C++ 地图模板没有用 try 实现。有什么具体原因吗?使用 trie 代替自平衡树是否有任何权衡?

【问题讨论】:

  • 如何使用 trie 存储非字符串(或至少类似字符串)的内容?
  • trie 的 O(n) 复杂度是如何计算的?
  • @n0rd: O(n) != O(sizeofword)...
  • 尝试也有很大的内存开销。
  • @OliCharlesworth 很大程度上取决于我们为 n 选择的内容。

标签: c++ algorithm data-structures map trie


【解决方案1】:

Tries只能在要存储的密钥可以逐位或逐字符处理时使用。 C++ std::mapstd::set 旨在将任何可比较的元素用作键,因此无法以逐个字符处理键的方式实现。相反,它们(通常)使用平衡的二叉搜索树,不需要对键进行内省,而是可以只使用比较器来进行快速查找。

如果您确定某些属性适用于您的密钥,则在某些情况下您可以做得比尝试更好(参见van Emde Boas tree 的示例)。但是,库设计人员必须针对许多用例进行设计,因此可能需要选择比绝对最佳选项慢的选项,因为他们需要处理尽可能多的选项。

此外,符合标准的 C++ 实现实际上完全有可能包含 std::mapstd::set 的特化,当键是字符串时使用 trie。我不相信任何人会这样做,但理论上是可能的。

希望这会有所帮助!

【讨论】:

  • 对于较小的数据集,平衡树可能比大多数常见的 trie 实现更有效。我发现 trie 确实只有在使用更大的数据集时才会变得有效。
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 2021-12-20
  • 1970-01-01
  • 2023-03-25
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多