网站首页 > 技术文章 正文
前言
时间复杂度主要是为了反映函数的执行时间随着输入规模增长而变化的规律,在一定程度上可以体现程序的执行效率和算法的优劣。作为程序员,掌握基本的算法时间复杂度的计算是很有必要的。
时间复杂度介绍
理论上,执行一个算法消耗的时间,是无法精确计算的,即使上机测试,收到各种因素影响,得到的时间也可能有较大差别。对于程序员,我们只需关注哪个算法花费的时间多,哪个算法花费的时间少就可以了。
针对执行时间,我们可以根据算法执行的语句的次数,进行一个简单的衡量。理论上,一个算法中语句执行次数多,它花费时间相对也多,因此,算法运行的时间与算法中语句的执行次数成正比。我们将算法中的语句的执行次数称为时间频度,表示为T(n),其中,n表示算法的输入规模,n的变化会引起T(n)的改变。
为了得到T(n)变化时表现的规律,我们引入时间复杂度的概念。若有某个函数f(n),当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,表示为T(n)=O(f(n)),O(f(n))称为算法的渐进时间复杂度,简称时间复杂度。
举例说明如何得到时间复杂度
场景1:
public int func() {
int a = 10 + 20; // 执行 1 次
return a; // 执行 1 次
}
T(n) = 1 + 1 = 2
由于是常数,时间复杂度为O(1)
场景2:
public void func() {
int n = 10; // 执行1次
for(int i = 0; i < n; i++) { // 执行 n 次
System.out.printf(i); // 执行 n 次
}
}
T(n) = n + n + 1 = 2n + 1
忽略常数项1,忽略和最高阶相乘的常数2,得到时间复杂度O(n)
其实,还可以先计算每个语句的时间复杂度,然后汇总:
public void func() {
int n = 10; // 时间复杂度O(1)
for(int i = 0; i < n; i++) { // 时间复杂度O(n)
System.out.printf(i); // 时间复杂度O(1)
}
}
O(1 * n * 1) = O(n)
场景3:
public int func(int n) {
for(int i = 0; i < n; i++) { // 执行n次
for(int j = 0; j < n; j++) { //由于外层循环,该语句执行 n * n 次
System.out.printf("Hello"); // 同理,执行n*n次
}
}
}
T(n) = n + n^2 + n^2 = 2n^2 + n
忽略低阶项,和高阶项的常数部分,得到时间复杂度O(n^2)
场景4:
public int func(int n) {
for(int i = 0; i < n; i = i* 2) { // i=2,4,8,16...时执行,可通过对数近似计算次数,执行log2(n)次
System.out.printf("Hello");
}
}
T(n) = 2log2(n)
忽略常数部分,得到时间复杂度O(log2(n))
总结
计算时间复杂度时,可以先先计算 T(n),然后忽略常数项,只保留最高次项,同时忽略最高项的系数,得到函数 f(n),则算法的时间复杂度就是 O(f(n))。
- 上一篇: 「算法」什么是冒泡排序 冒泡排序的算法原理
- 下一篇: 「算法」几分钟时间让你彻底学会—空间复杂度
猜你喜欢
- 2024-09-25 评估算法及算法的时间复杂度 评估算法有哪些
- 2024-09-25 关于算法的时间复杂度和大O记号的简单理解
- 2024-09-25 算法001:O(1)时间复杂度的底层原理,什么是时间复杂度?来看
- 2024-09-25 面试官:说说你对算法中时间复杂度,空间复杂度的理解?如何计算
- 2024-09-25 排序算法时间复杂度、空间复杂度分享
- 2024-09-25 数据结构与算法-时间复杂度 数据结构中时间复杂度的定义
- 2024-09-25 算法的时间和空间复杂度-程序员的噩梦
- 2024-09-25 Python算法 00--时间复杂度和空间复杂度
- 2024-09-25 「算法」几分钟时间让你彻底学会—空间复杂度
- 2024-09-25 「算法」什么是冒泡排序 冒泡排序的算法原理
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)