【问题标题】:Is a trie equivalent to std::map<std::string, int> in C++?trie 是否等同于 C++ 中的 std::map<std::string, int> ?
【发布时间】:2020-07-18 05:49:35
【问题描述】:

trie 的通常实现是否等同于

std::map&lt;std::string, int&gt;

在 C++ 中?

通过等价,我的意思是:它们的空间复杂度是否相同,它们各自的操作是否具有相同的时间复杂度?

【问题讨论】:

  • 为什么投反对票?
  • 我知道它们基本上是两种不同的数据结构。问题是关于空间和时间复杂度的比较

标签: c++ time-complexity trie space-complexity


【解决方案1】:

不,我不这么认为。 std::map 和 std::set 通常实现为red-black balanced binary trees

前缀树的空间复杂度要好得多——您将一整串字符串的公共前缀存储在一个统一的位置,而在二叉树中,整个字符串都存储在节点中,所以前缀是在每个包含它的字符串中重复。

查找、插入、删除的时间复杂度仍然是平均 O(log n)。然而,常数因素通常很重要。前缀树通常以较低的高度但较大的宽度进行交易。具体应用对于选择哪一个很重要。

【讨论】:

  • 另外,如果你想从trie返回key,你需要从节点合成它们。这显然是节点数上的 O(log N) 操作,字符串长度上的 O(N)。
猜你喜欢
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
相关资源
最近更新 更多