深入理解时间复杂度
作者:互联网
时间复杂度 O(f(n))
算法需要执行基本运算的次数的
级别。
一,思考
目前个人认为:时间复杂度实际就是考量两种情况。
1. 循环 for(),while()
2. 递归
二,何为n
理论上指:问题规模。
拆开来说,就是for(),while()循环了n次,递归了多少次(递归的情况略微复杂)。
三,何为f(n)
算法执行基本运算的次数【基本运算(加减乘除)】
1. 举个例子
例一
int a , b = 0;//用于交换的临时变量
for(int i=0;i<n;i++){ // for循环共执行了n次
a += b; //执行"a += b"一次
}
所以 f(n)= n * 1 = n。
例二
int a , b = 0;//用于交换的临时变量
for(int i=0;i<n;i++){ // for循环共执行了n次
a += b;//执行"a += b"一次
a += b;//执行"a += b"一次
}
所以 f(n)= n * (1 + 1)= 2n。
2. 总结
在复杂的程序也是这样计算f(n)。
四,什么是大O
我自己的理解:就是带有具体意义(耗费时间的程度)评级,就像 甲乙丙丁戊己庚辛壬癸。
1.时间复杂度概念理解
a. 概念下的时间复杂度
大O用来表示上界的,这里的上界是极限的概念,即n -> ∞,当用它作为算法的最坏情况运行时间的上界.例如:图中的 插排,快排的最坏情况的时间复杂度。
b.实际面试情况下的说的时间复杂度
就是我们平时说的平均时间复杂度。
2.算法时间复杂的的排序
O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶
O(logn)中的log是以什么为底?
结论:我们统一说 logn,也就是忽略底数的描述。
证:假如有两个算法的时间复杂度,分别是log以2为底n的对数和log以10为底n的对数。
3.总结
- 数据用例的不一样,时间复杂度也是不同的,理论上的数据用例是无穷大,而实际上可能是有限的数据用例,抛开数据规模谈复杂度就是耍流氓。
五.时间复杂度的计算(数据规模无穷大)
1. 求出f(n)
一行一行的去求,把结果加起来即可。
2. 化简f(n)
假设 f(n) = 2n^2 + 10n + 1000
首先 去掉加法常数项: f(n) = 2n^2 + 10n
然后 去掉常数系数 f(n) = n^2 + n
最后 去掉 低阶的项 f(n) = n^2 。
【也可以用提取n,然后去掉加法常数项的思路:f(n) = n*(n + 1)-> f(n) = n^2】
参考书目
《代码随想录》《算法笔记》 《数据结构与算法》
标签:int,复杂度,算法,理解,时间,logn,深入,2n 来源: https://www.cnblogs.com/the-travel-about-code/p/16439670.html