时间复杂度

简介: 在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

一、写在前面

在分析二分查找法时,看到O(1),O(N),O(logn),O(nlogn)等时间复杂度的表达式,经过一番分析才最有所了解,并记录之。

时间复杂度个人认为就是不同的算法(程序)在执行时所消耗的时间维度,不同的算法结果相同但是消耗时间不同,优秀算法肯定时间复杂度低。

时间复杂度通用表示方法

大O符号表示法 」,即 T(n) = O(f(n)),在 大O符号表示法中,时间复杂度的公式是: T(n) = O( f(n) ),其中f(n) 表示每行代码执行次数之和,而 O 表示正比例关系,这个公式的全称是:算法的渐进时间复杂度

intsum(intn) {
intvalue=0;
inti=1;
while (i<=n) {
value=value+i;
i++;
    }
returnvalue;
}
假设n=100,该方法的执行次数为①(1)、②(1次)、③(100次)、④(100次)、⑤(100次)、⑥(1次),假设每执行一次需要时间是1ms那么程序执行完完毕需要合计1+1+100+100+100+1=303ms


按照上面的例子 f(n)=3n+3,即O=3n+3,从这个结果可以看出,这个算法的耗时是随着n的变化而变化,因此,我们可以简化的将这个算法的时间复杂度表示为:T(n) = O(n)

为什么可以这么去简化呢,因为大O符号表示法并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。

这里有个重点是时间复杂度关系的是数量级,原则是:

  • 省略常数,如果运行时间是常数量级,用常数1表示;
  • 保留最高阶的项
  • 变最高阶项的系数为1

所以上面的例子中,如果n无限大的时候,T(n) = 3n+3中的常量3就没有意义了,倍数3也意义不大。因此直接简化为T(n) = O(n) 就可以了。

二、高中数学

(一)指数函数

函数 y = ax (a>0且 a≠1)被称作为指数函数,自变量x叫做指数,a被称为底数。

(二)对数函数

如果ax =N(a>0,且a≠1),那么数x叫做以a为底N的对数,记作x=logaN,读作以a为底N的对数,其中a叫做对数的底数,N叫做真数

三、常见的时间复杂度量级

(一)常数阶O(1)

HashMapmap=newHashMap<>();
map.get(key);
比如从hash表中获取指定key的值,不会随着key的数量增多而增加程序的时间复杂度。

即 T(n) = O(1)

(二)对数阶 O(logn)

// n = 32 则 i=1,2,4,8,16,32for (inti=1; i<=n; i=i*2) {
System.out.println("对数阶:"+n);
}

i 的值随着 n 成对数增长,读作 2 为底 n 的对数,即 f(x) = log2n,T(n) = O( log2n),简写为 O(logn),还有其它算法比如二分查找法,时间复杂度也是 O(logn)

(三)线性阶 O(n)

for (inti=1; i<n; i++) {
System.out.println("线性阶:"+n);
}
n的值为多少,程序就运行多少次,类似函数y=f(x),即T(n) =O(n)


(四)线性对数阶 O(nlogn)

for (intm=1; m<=n; m++) {
inti=1;
while (i<n) {
i=i*2;
System.out.println("线性对数阶:"+i);
    }
}

线性对数阶 O(nlogn)是指将对数阶 O(logn)的代码循环 n 遍执行,那么它的时间复杂度就是 n * O(logn),也就是了 O(nlogn),归并排序的复杂度就是 O(nlogn)。

若 n = 2 则程序执行 2 次,若 n=4,则程序执行 8 次,依次类推

(五)平方阶 O(n2)

for (inti=1; i<=n; i++) {
for (intj=1; j<=n; j++) {
System.out.println("平方阶:"+n);
    }
}

若 n = 2,则打印 4 次,若 n = 3,则打印 9,即 T(n) =   O(n2)

四、总结

以上五种时间复杂度的图形描述如下

从上图可以得出结论,当 x 轴 n 的值越来越大时,y 轴耗时的时长为:

O(1) < O(logn) < O(n) < O(nlogn) < O(n2)

image.png

相关文章
|
2天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23281 2
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
4天前
|
人工智能 API 开发工具
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
Claude Code是我目前最推荐的AI编程工具,没有之一。 它可能不是最简单的,但绝对是上限最高的。一旦跑通安装、接上模型、定好规范,你会发现很多原本需要几小时的工作,现在几分钟就能搞定。 这套方案的核心优势就三个字:可控性。你不用依赖任何不稳定服务,所有组件都在自己手里。模型效果不好?换一个。框架更新了?自己决定升不升。 这才是AI时代开发者该有的姿势——不是被动等喂饭,而是主动搭建自己的生产力基础设施。 希望这篇保姆教程,能帮你顺利上车。做出你自己的作品。
7204 17
Claude Code国内安装:2026最新保姆教程(附cc-switch配置)
|
12天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
4507 24
|
7天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
3156 10
|
6天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
2598 8
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
24天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
20147 61
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)