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

为何对std::set使用全局std::upper_bound时时间复杂度为线性?

std::set两种upper_bound用法的时间复杂度差异解析

【警告!】
若将s.upper_bound(7)替换为upper_bound(s.begin(), s.end(), 7)——即前置模块中用于vector的语法,虽能得到预期结果,但时间复杂度为集合s大小的线性O(n),而非对数级O(logN),请务必避免!

核心差异说明

这两种写法最终都能找到集合中大于7的第一个元素,但底层实现逻辑完全不同:

  • upper_bound(s.begin(), s.end(), 7)是C++标准库的通用算法,它只识别迭代器,不了解容器内部结构。执行时会从起始迭代器开始逐个遍历元素做比较,直到找到符合条件的元素,因此时间复杂度为线性O(n),元素数量越多,耗时越长。
  • s.upper_bound(7)是std::set的成员函数,而std::set底层基于红黑树(一种平衡二叉搜索树)实现。该成员函数可以直接利用红黑树的有序结构,通过二分查找快速定位目标元素,时间复杂度为对数级O(logN),数据量越大,和通用算法的效率差距就越显著。

代码示例对比

// 通用算法版本:O(n) 线性遍历
upper_bound(s.begin(), s.end(), 7 );
// set成员函数版本:O(logN) 二分查找
s.upper_bound(7);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:42:06