算法需要执行基本运算的次数的
级别。
目前个人认为:时间复杂度实际就是考量两种情况。
理论上指:问题规模。
拆开来说,就是for(),while()循环了n次,递归了多少次(递归的情况略微复杂)。
算法执行基本运算的次数【基本运算(加减乘除)】
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。
在复杂的程序也是这样计算f(n)。
我自己的理解:就是带有具体意义(耗费时间的程度)评级,就像 甲乙丙丁戊己庚辛壬癸。
大O用来表示上界的,这里的上界是极限的概念,即n -> ∞,当用它作为算法的最坏情况运行时间的上界.例如:图中的 插排,快排的最坏情况的时间复杂度。
就是我们平时说的平均时间复杂度。
O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶
结论:我们统一说 logn,也就是忽略底数的描述。
证:假如有两个算法的时间复杂度,分别是log以2为底n的对数和log以10为底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】
《代码随想录》《算法笔记》 《数据结构与算法》