Java随笔-时间复杂度和空间复杂度
一、时间复杂度Time Complexity1.1 定义衡量算法执行时间随输入规模增长的变化趋势。不是实际运行时间受机器、编译器影响而是执行语句的次数。1.2 大 O 表示法规则只保留最高阶项忽略常数和低阶项。O(1) O(log n) O(n) O(n log n) O(n^2) O(n^3) O(2^n) O(n!)1.3 常见时间复杂度速查表时间复杂度名称示例O(1)常数时间数组随机访问、HashMap 查找O(log n)对数时间二分查找、二叉搜索树查找O(n)线性时间遍历数组、链表查找O(n log n)线性对数时间快速排序平均、归并排序、堆排序O(n^2)平方时间冒泡排序、选择排序、插入排序O(n^3)立方时间三重循环、矩阵乘法朴素算法O(2^n)指数时间递归斐波那契、子集问题O(n!)阶乘时间全排列、旅行商问题暴力1.4 计算口诀场景时间复杂度例子无循环、无递归O(1)数组随机访问arr[i]循环一次O(n)for (i0; in; i)循环嵌套O(n^2)两层 for 循环循环三层O(n^3)三层 for 循环循环变量乘除O(log n)for (i1; in; i*2)递归减半O(log n)二分查找递归分治O(n log n)归并排序、快速排序平均递归两个分支O(2^n)斐波那契递归全排列O(n!)排列组合问题1.5 计算示例// 示例 1O(1) - 常数时间intgetFirst(int[]arr){returnarr[0];// 执行 1 次与 n 无关}// 示例 2O(n) - 线性时间intsum(int[]arr){ints0;for(inti0;iarr.length;i){// 执行 n 次sarr[i];}returns;}// 示例 3O(n^2) - 平方时间voidbubbleSort(int[]arr){for(inti0;iarr.length;i){// n 次for(intj0;jarr.length-i-1;j){// 平均 n/2 次if(arr[j]arr[j1])swap(arr,j,j1);}}// 总次数 n * n/2 n^2/2 - 忽略常数 - O(n^2)}// 示例 4O(log n) - 对数时间intbinarySearch(int[]arr,inttarget){intleft0,rightarr.length-1;while(leftright){// 每次减半执行 log2(n) 次intmidleft(right-left)/2;if(arr[mid]target)returnmid;elseif(arr[mid]target)leftmid1;elserightmid-1;}return-1;}// 示例 5O(n log n) - 线性对数时间voidmergeSort(int[]arr,intleft,intright){if(leftright)return;intmidleft(right-left)/2;mergeSort(arr,left,mid);// T(n/2)mergeSort(arr,mid1,right);// T(n/2)merge(arr,left,mid,right);// O(n)// 递归式T(n) 2T(n/2) O(n) - 主定理 - O(n log n)}// 示例 6O(2^n) - 指数时间intfibonacci(intn){if(n1)returnn;returnfibonacci(n-1)fibonacci(n-2);// 两个分支递归树节点数 2^n}// 示例 7O(n!) - 阶乘时间voidpermute(int[]arr,intstart){if(startarr.length-1){print(arr);return;}for(intistart;iarr.length;i){// n 层递归每层 n, n-1, n-2...swap(arr,start,i);permute(arr,start1);swap(arr,start,i);}// 总排列数 n!每个排列生成需要 O(n) 时间}1.6 递归算法的时间复杂度分析递归树法// 斐波那契递归// fib(5)// / \// fib(4) fib(3)// / \ / \// fib(3) fib(2) fib(2) fib(1)// ...// 树高 n每层节点数翻倍 - 总节点数 2^n - O(2^n)主定理Master Theorem适用于分治递归T(n) aT(n/b) f(n)T(n) aT(n/b) O(n^c) 比较 c 与 log_b(a) - 若 c log_b(a) - T(n) O(n^(log_b(a))) - 若 c log_b(a) - T(n) O(n^c * log n) - 若 c log_b(a) - T(n) O(n^c)算法递归式abclog_b(a)结果二分查找T(n) T(n/2) O(1)1200O(log n)归并排序T(n) 2T(n/2) O(n)2211O(n log n)快速排序平均T(n) 2T(n/2) O(n)2211O(n log n)快速排序最坏T(n) T(n-1) O(n)----O(n^2)二、空间复杂度Space Complexity2.1 定义衡量算法执行过程中额外占用内存随输入规模增长的变化趋势。不包括输入数据本身占用的空间而是算法运行时的辅助空间。2.2 常见空间复杂度速查表空间复杂度名称示例O(1)常数空间交换两个数、原地排序O(log n)对数空间二分递归的调用栈O(n)线性空间复制数组、递归深度 nO(n^2)平方空间二维数组、矩阵运算O(n!)阶乘空间全排列的存储极少见2.3 计算规则场景空间复杂度例子只用几个变量O(1)交换两个数开辟与 n 相关的数组O(n)复制数组递归深度O(n)递归调用栈递归分治O(log n)二分递归二维数组O(n^2)矩阵运算递归树O(n) / O(log n)取决于递归深度2.4 计算示例// 示例 1O(1) 额外空间 - 原地操作voidswap(inta,intb){inttempa;// 只用 1 个额外变量ab;btemp;}// 示例 2O(n) 额外空间 - 复制数组int[]copyArray(int[]arr){int[]copynewint[arr.length];// 开辟 n 个空间for(inti0;iarr.length;i){copy[i]arr[i];}returncopy;}// 示例 3O(n) 递归栈空间 - 线性递归intfactorial(intn){if(n1)return1;returnn*factorial(n-1);// 递归深度 n每层一个栈帧}// 示例 4O(log n) 递归栈空间 - 二分递归intbinarySearch(int[]arr,intleft,intright,inttarget){if(leftright)return-1;intmidleft(right-left)/2;if(arr[mid]target)returnmid;elseif(arr[mid]target)returnbinarySearch(arr,mid1,right,target);// 深度 log nelsereturnbinarySearch(arr,left,mid-1,target);}// 示例 5原地排序 O(1) 额外空间voidquickSort(int[]arr,intleft,intright){if(leftright)return;intpivotpartition(arr,left,right);// 原地分区不开辟新数组quickSort(arr,left,pivot-1);quickSort(arr,pivot1,right);// 额外空间递归栈 O(log n)平均情况}// 示例 6归并排序 O(n) 额外空间voidmergeSort(int[]arr,intleft,intright){if(leftright)return;intmidleft(right-left)/2;mergeSort(arr,left,mid);mergeSort(arr,mid1,right);// 需要额外 O(n) 空间来合并两个有序数组int[]tempnewint[right-left1];// ... 合并逻辑}三、常见算法复杂度对照表算法时间复杂度平均时间复杂度最坏空间复杂度稳定性数组随机访问O(1)O(1)O(1)-数组顺序查找O(n)O(n)O(1)-二分查找O(log n)O(log n)O(1)-冒泡排序O(n^2)O(n^2)O(1)稳定选择排序O(n^2)O(n^2)O(1)不稳定插入排序O(n^2)O(n^2)O(1)稳定希尔排序O(n log n)O(n^2)O(1)不稳定快速排序O(n log n)O(n^2)O(log n)不稳定归并排序O(n log n)O(n log n)O(n)稳定堆排序O(n log n)O(n log n)O(1)不稳定计数排序O(n k)O(n k)O(k)稳定桶排序O(n k)O(n^2)O(n k)稳定基数排序O(d(n k))O(d(n k))O(n k)稳定哈希表查找O(1)O(n)O(n)-二叉搜索树查找O(log n)O(n)O(n)-平衡二叉树查找O(log n)O(log n)O(n)-BFS/DFS图O(V E)O(V E)O(V)-Dijkstra堆优化O((V E) log V)O((V E) log V)O(V)-Floyd-WarshallO(V^3)O(V^3)O(V^2)-动态规划一维O(n)O(n)O(n)-动态规划二维O(n^2)O(n^2)O(n^2)-四、计算技巧4.1 时间复杂度计算步骤找循环几层循环就大概几阶注意循环变量的增量看递归画递归树看每层工作量和深度用主定理分治递归T(n) aT(n/b) f(n)4.2 空间复杂度计算步骤看额外数组有没有新开数组开多大看递归深度递归调用栈占多少层注意隐式空间比如 Java 中对象引用、String 拼接4.3 常见陷阱陷阱说明正确复杂度忽略递归栈空间递归的空间复杂度不是 O(1)看递归深度混淆输入空间和辅助空间空间复杂度不算输入数据本身只算额外空间平均 vs 最坏快速排序平均 O(n log n)最坏 O(n^2)通常说平均原地排序的栈空间快速排序原地但递归栈 O(log n)空间 O(log n)五、Android 开发中的实际考量// 例子 1加载图片列表// 时间复杂度 O(n)遍历 n 张图片// 空间复杂度 O(k)缓存 k 张图片LRUCache 控制// 例子 2RecyclerView 的 DiffUtil// 时间复杂度 O(n^2)Myers 差分算法最坏情况// 空间复杂度 O(n)需要额外的序列化空间// 例子 3深拷贝一个复杂对象// 时间复杂度 O(n)遍历所有节点// 空间复杂度 O(n)新对象占用的内存// 例子 4遍历 View 树// 时间复杂度 O(n)n 个 View 节点// 空间复杂度 O(h)h 为树高递归栈深度// 例子 5字符串拼接JavaStringresult;for(Strings:list){results;// 每次创建新 String 对象O(n^2) 时间}// 正确做法StringBuilderO(n) 时间O(n) 空间StringBuildersbnewStringBuilder();for(Strings:list){sb.append(s);}Stringresultsb.toString();六、总结维度关注点计算核心时间复杂度执行快慢语句执行次数看循环和递归空间复杂度内存占用额外辅助空间看数组和递归栈核心口诀时间复杂度看跑多快空间复杂度看用多少内存两者通常需要权衡。经典权衡案例场景时间优先空间优先查找哈希表 O(1) 时间O(n) 空间二分查找 O(log n) 时间O(1) 空间排序归并排序 O(n log n) 稳定O(n) 空间堆排序 O(n log n) 不稳定O(1) 空间最短路径Dijkstra 堆 O((VE)log V)Floyd O(V^3) 但代码简单字符串匹配KMP O(n) 时间O(m) 空间暴力 O(n*m) 时间O(1) 空间一句话时间换空间或空间换时间是算法设计的永恒主题。

相关新闻

Android随笔-LRU 缓存的底层数据结构详解

Android随笔-LRU 缓存的底层数据结构详解

LRU 缓存的底层数据结构详解 一、LRU 是什么 LRU(Least Recently Used,最近最少使用)是一种缓存淘汰策略:当缓存满时,优先淘汰最久没有被访问的数据。 访问顺序:A → B → C → D → B → A → E缓存容量 …

2026/7/16 2:06:01阅读更多 →
Android—Jetpack教程(二):ViewModel与LiveData实战解析

Android—Jetpack教程(二):ViewModel与LiveData实战解析

1. ViewModel与LiveData为何成为Android开发标配每次屏幕旋转导致Activity重建时,数据丢失的烦恼还记得吗?三年前我维护的一个电商应用就因此频繁出现空指针崩溃。直到Google推出ViewModel和LiveData这对黄金组合,这类问题才迎刃而解。现在它…

2026/7/16 2:06:01阅读更多 →
2026年西湖区大学生学习工具怎么选4个实用选择标准帮你把关

2026年西湖区大学生学习工具怎么选4个实用选择标准帮你把关

"2026年西湖区大学生选学习工具,核心是匹配课堂复习、论文调研、知识自测这些日常校园场景,不用追热门噱头或者贵得离谱的付费工具,记住四个实用选择标准就能帮你把关,避开同学盲安利踩的坑,接下来我会把标准拆解…

2026/7/16 2:01:01阅读更多 →
iOS开发证书全流程:从创建到团队协作的p12文件管理

iOS开发证书全流程:从创建到团队协作的p12文件管理

1. iOS开发证书基础概念与团队协作场景第一次接触iOS证书体系时,我盯着钥匙串里那堆看不懂的条目发呆了半小时。后来才明白,这套体系就像建筑行业的"施工许可证"——没有合规的证书,你的App连安装到手机的资格都没有。对于团队开发…

2026/7/16 3:11:06阅读更多 →
3个步骤让英雄联盟玩家体验智能化游戏助手

3个步骤让英雄联盟玩家体验智能化游戏助手

3个步骤让英雄联盟玩家体验智能化游戏助手 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为游戏中的繁琐操作烦恼吗?League A…

2026/7/16 3:11:06阅读更多 →
【管理篇 / 升级】❀ 09. 固件升级路径规划与配置保全 ❀ FortiGate 防火墙

【管理篇 / 升级】❀ 09. 固件升级路径规划与配置保全 ❀ FortiGate 防火墙

1. 为什么需要规划固件升级路径每次看到FortiGate发布新版本固件时,很多管理员的第一反应就是"赶紧升级"。但实际操作中,直接从6.0跳到7.0版本往往会导致配置丢失或设备异常。我去年就遇到过这种情况,当时为了修复一个安全漏洞&…

2026/7/16 3:11:06阅读更多 →
Seed 2.0:TRAE协议驱动的开发意图代理架构解析

Seed 2.0:TRAE协议驱动的开发意图代理架构解析

1. 项目概述:Seed 2.0 不是又一个 IDE 插件,而是一套重构人机协作边界的底层协议 “Seed 2.0”这个词最近在开发者社区里出现的频率,已经明显超出了普通工具更新的范畴。它不再只是某个编辑器里的新功能按钮,而是开始频繁和 TRAE…

2026/7/16 3:11:06阅读更多 →
一键获取Steam游戏清单:Onekey工具的完整使用指南

一键获取Steam游戏清单:Onekey工具的完整使用指南

一键获取Steam游戏清单:Onekey工具的完整使用指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 你是否曾为管理Steam游戏文件而烦恼?复杂的API调用、繁琐的清单解析、技…

2026/7/16 3:11:06阅读更多 →
【CubeMX+Keil】从零到一:STM32CubeMX配置与Keil MDK工程构建全流程解析

【CubeMX+Keil】从零到一:STM32CubeMX配置与Keil MDK工程构建全流程解析

1. 环境准备与软件安装第一次接触STM32开发的朋友可能会被各种工具链搞得头晕眼花。别担心,我这里会手把手带你完成开发环境的搭建。STM32CubeMX和Keil MDK是ST官方推荐的黄金组合,一个负责硬件配置,一个负责代码编写和调试,配合起…

2026/7/16 3:06:05阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/15 6:42:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/15 6:12:45阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/15 10:54:00阅读更多 →
A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

A--10 Codex Review与GitHub PR工作流实战指南:从代码审查到安全合并

摘要:本文系统讲解如何利用Codex App的Review功能与GitHub PR工作流,实现从代码修改到安全合并的完整流程。涵盖Review面板深度使用、/review命令实战、GitHub Connector配置、PR描述撰写技巧,以及常见问题排查方法。通过多个实战案例和流程图,帮助开发者建立高效的AI辅助代…

2026/7/16 0:00:38阅读更多 →
遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

遗传算法解5皇后问题:从Hello World到工业优化的进化实验室

1. 项目概述:为什么用遗传算法解5皇后问题,而不是直接回溯?我带过十几届算法课,也给不少初创团队做过AI架构咨询。每次讲到组合优化问题,学生和工程师的第一反应永远是“写个回溯试试”。这没错——55棋盘上找所有合法…

2026/7/16 0:00:38阅读更多 →
5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

5.1V稳压管输出为何只有4.7V?工作电流与负载影响分析

前几天调试一个简单的电源模块,用到了5.1V稳压管。电路接好,上电测试,万用表一量——输出居然只有4.7V。第一反应是稳压管坏了,换了一个新的,结果还是4.7V。这让我想起很多初学者都会遇到的困惑:明明标称5.…

2026/7/16 0:00:38阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/15 8:52:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/15 14:06:23阅读更多 →