当前位置: 首页 > news >正文

【数据结构与算法】 时间复杂度计算

👨‍💻 关于作者:会编程的土豆

“不是因为看见希望才坚持,而是坚持了才看见希望。”

你好,我是会编程的土豆,一名热爱后端技术的Java学习者。

📚正在更新中的专栏:

  • 《数据结构与算法》

  • 《leetcode hot 100》

💕作者简介:后端学习者

第一步:找出基本操作
找出代码中执行最频繁、最内层的操作,如加法、比较、赋值、数组访问等。

第二步:计算执行次数
分析代码结构,推导出基本操作的执行次数关于 nn 的函数 T(n)T(n)。

  • 顺序结构:总次数是各步骤次数之和。

  • 条件判断:取执行次数最多的分支。

  • 循环:次数取决于循环变量和条件。

    • 单层循环,循环 mm 次:乘 mm。

    • 嵌套循环:相乘。

    • 循环变量变化不规律(如每次翻倍):涉及对数。

第三步:保留最高次项,忽略常数
大 OO 表示法简化 T(n)T(n)。
规则:去掉常数系数,只保留增长最快的项。

1.O(1) —— 常数阶

int getFirst(int arr[]) { return arr[0]; }

分析
无论数组多大,只执行一次数组访问 → O(1)。


2. O(n) —— 线性阶

int findMax(int arr[], int n) { int maxVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > maxVal) { maxVal = arr[i]; } } return maxVal; }

分析
循环执行n-1次,每次比较 1 次 → 总操作次数 ~ n → O(n)。


3. O(n2) —— 平方阶

void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { // 外层 n 次 for (int j = 0; j < n - i - 1; j++) { // 内层 ~ n 次 if (arr[j] > arr[j + 1]) { std::swap(arr[j], arr[j + 1]); } } } }

分析
总比较次数 ≈ n(n−1)/2​ → 最高次项 n2→ O(n2)。

我们只数if (arr[j] > arr[j+1])这行比较语句的执行次数。

  • i = 0:内层循环j从 0 到n-2,比较了n-1次。

  • i = 1:内层循环j从 0 到n-3,比较了n-2次。

  • i = 2:内层循环比较了n-3次。

  • ...

  • i = n-2:内层循环比较了1次。

所以,总的比较次数T(n)就是一个等差数列的和:
T(n) = (n-1) + (n-2) + ... + 1

根据高斯求和公式(首项加末项乘以项数除以2),这个和就等于n(n-1)/2

  1. 只保留最高次项:因为当n很大时,它决定了函数的增长趋势。丢掉- (1/2)n这个低次项。

  2. 忽略最高次项的常数系数:因为系数不改变增长的趋势。丢掉1/2这个系数。

(1/2)n^2 - (1/2)n---> 保留最高次项(1/2)n^2---> 忽略系数1/2--->得到n^2

所以我们就说,这个冒泡排序算法的时间复杂度是O(n^2)


4. O(log⁡n)—— 对数阶

int binarySearch(int arr[], int n, int target) { int left = 0, right = n - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) return mid; else if (arr[mid] < target) left = mid + 1; else right = mid - 1; } return -1; }

核心逻辑:log 就是在问“需要折半多少次?

举个例子:从 100 折半到 1

100 → 50 (折半1次) 50 → 25 (折半2次) 25 → 12 (折半3次) 12 → 6 (折半4次) 6 → 3 (折半5次) 3 → 1 (折半6次)

问:折半了多少次?答:6次

数学上,这就是在解方程:

100 × (1/2)^k = 1

也就是:

100 = 2^k

k = log₂(100) ≈ 6.64(取整就是6或7次)

所以规律是:

初始大小 n折半到1需要的次数用数学表示
21次log₂2 = 1
42次log₂4 = 2
83次log₂8 = 3
164次log₂16 = 4
102410次log₂1024 = 10

发现了吗?次数 = log₂(n)

一句话记住

log₂(n) 的定义就是:n 连续除以 2,多少次能变成 1

所以:

  • 二分查找每次折半 → 需要 log n 次

  • 二叉树每次分两叉 → 高度是 log n

  • 任何"每次规模减半"的算法 → 复杂度都带 log

5. O(nlog⁡n) —— 线性对数阶

void weirdLoop(int n) { for (int i = 0; i < n; i++) { // n 次 int j = 1; while (j < n) { // log n 次 j *= 2; } } }

分析
外层 nn 次 × 内层 log⁡n 次 → O(nlogn)。


6. 递归复杂度(斐波那契)

int fib(int n) { if (n <= 1) return n; return fib(n - 1) + fib(n - 2); }

分析
递归树是一棵二叉树,节点数 ~ 2n2n → O(2n)O(2n)(指数级,非常慢)。

7. 更好递归(备忘录优化 → O(n))

int fibMemo(int n, int memo[]) { if (n <= 1) return n; if (memo[n] != -1) return memo[n]; return memo[n] = fibMemo(n - 1, memo) + fibMemo(n - 2, memo); }

分析
每个 n 只计算一次 → O(n)

总结表(C++ 版)

代码模式时间复杂度
普通赋值、数组访问、returnO(1)O(1)
单层循环(1 到 n)O(n)O(n)
双层循环(i/j 都到 n)O(n2)O(n2)
循环变量每次翻倍(j *= 2O(log⁡n)O(logn)
外层 n 次,内层 log n 次O(nlog⁡n)O(nlogn)
朴素递归(如斐波那契)O(2n)O(2n)
分治递归(归并排序)O(nlog⁡n)O(nlogn)
http://www.jsqmd.com/news/610186/

相关文章:

  • 【C# 13主构造函数调试实战指南】:20年微软MVP亲授5大断点陷阱与3步精准定位法
  • 基于单片机的智能多功能鱼缸设计
  • 程序员薪资倒挂现象与技术路线选择策略
  • 电流互感器原理、结构与选型指南
  • 混合编程项目预算超支预警!Mojo-Python边界治理的4层成本防火墙(含CI/CD阶段自动审计脚本)
  • 无障碍助手:OpenClaw利用Qwen3.5-9B实现屏幕阅读增强
  • 硬件工程师的调试日常与职场趣事
  • FPN实战:用PyTorch从零搭建特征金字塔网络(附代码)
  • EnOcean BLE设备轻量级解析库设计与实现
  • Adafruit TLV320 I2S库:TLV320DAC3100音频驱动详解
  • 2026年4月铁路地铁电力电缆生产厂家推荐:含中低压、低压、中压等厂家 - 品牌2026
  • FastAPI官方未公开的AI流式插件生态(v2.0.0b3内测版独家解析):仅限前500名开发者获取的pip install --pre加速安装密钥
  • 末九网安保研华五CS:一个‘零科研’选手的夏令营海投与面试逆袭全记录
  • 0Ω电阻的工程应用与电流承载能力解析
  • 嵌入式NTP客户端:一次校准,离线维持49天高精度时间
  • 高效掌握Equalizer APO:Windows音频增强与定制完全指南
  • HAL_CAN_AddTxMessage硬件中断?原来是这个参数在捣鬼(附正确用法)
  • Hinge损失函数:从SVM的基石到现代机器学习中的间隔优化
  • 2026年Q2新疆古建配件生产厂家选购指南:合格供应商名录 - 优质品牌商家
  • macos简单配置openclaw勘
  • OpenClaw移动办公:Qwen3.5-9B通过Termux在安卓手机运行
  • 人体感应灯工作原理与安装调试指南
  • 旋转变压器:从电磁耦合到高精度位置解算的工程实践
  • OpenClaw隐私计算:Qwen3.5-9B-AWQ-4bit本地处理加密图片
  • G-Helper技术评测:华硕笔记本硬件控制与性能优化实战指南
  • 【多模态大模型——跨越感知与认知的鸿沟】第5章 验证阶段:自我修正与一致性检查
  • 2026年4月电力电缆生产厂家推荐:含中低压、低压、中压、变频等电缆品类 - 品牌2026
  • SmoothPin:嵌入式GPIO引脚无阻塞平滑控制库
  • CANoe_UDS-bootloader 自动化测试系列(一)搭建CANoe测试框架:XML与CAPL模块的工程化抉择
  • OpenClaw自动化周报系统:Qwen3.5-9B汇总Git提交生成团队报告