You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于std::map嵌套std::set结构查找后插入的时间复杂度疑问求助

std::map<std::string, std::set<std::string>>图插入操作的时间复杂度解析

平均/最坏时间复杂度的修正

你之前的分析有误,graph[from].insert(to)的时间复杂度是加法关系而非乘法,拆解来看:

  • 第一步:graph[from]操作——std::map基于红黑树实现,查找或插入键from的比较次数为O(log V)(V是图的节点总数),每次字符串比较的时间是O(x)(x为from的长度),因此这一步耗时O(x * log V)。
  • 第二步:set.insert(to)操作——std::set同样是红黑树实现,插入操作的比较次数为O(log E_from)(E_from是from节点的邻边数,最坏情况等于总边数n),每次字符串比较耗时O(y)(y为to的长度),这一步耗时O(y * log n)(最坏情况)。

所以整体平均/最坏时间复杂度是O(x*log V + y*log n)。

最佳时间复杂度的明确

红黑树的最佳场景(目标节点为根节点)下,复杂度并非O(x*y),而是O(x + y),理由如下:

  • 若from已存在于std::map且是红黑树的根,仅需一次字符串比较(O(x))即可定位到对应的std::set;
  • 若to已存在于该std::set且是红黑树的根,仅需一次字符串比较(O(y))即可确认存在,插入操作直接返回;
  • 即使是插入新节点:若from作为新根插入std::map,红黑树调整为常数时间,核心开销仍是字符串比较O(x);同理to作为新根插入std::set,开销为O(y)。

两种场景下,整体最佳时间复杂度都是O(x + y),不存在O(x*y)的情况——字符串比较是分别针对from和to的独立操作,不存在相乘的逻辑。

结论

  • 平均/最坏时间复杂度:O(x*log V + y*log n)
  • 最佳时间复杂度:O(x + y)

内容的提问来源于stack exchange,提问作者Slash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:35:22