算法分析——时间复杂度
时间复杂度
定义&意义
- 一行代码运行的时间*该行运行次数(对所有行执行次运算)
- 描述一个算法的快慢性能(假设在同样算力的计算机上,且没有其他任务消耗计算机任务的理想情况下)
标识
- 约定用T(N) 表示所有主要语句的运行时间 ,单位时间为单位
- 将T(N)近似后用O(f(N)) 表示,其中,f(N) ~ F(N)
计算方法
用一个例子简单说明
点击查看代码
int a = 10 ;
for(i =0 ; i < a ; i++){
System.out.println(i);
}
-
第一行执行一次 ;记n
-
第二行中 ,i = 0 执行一次, i < a 执行11次,10次符合条件,1次判断越界,i++ 执行10次;分别记作 n、11n、10n
-
第三行中,执行10次 ,记10n
-
由此T(N) = 1n+1n+11n+10n+10n
显眼从数学上说是个一次函数,也就是说改程序段的时间复杂度是线性的,由此推知,当时嵌套的二重、三重ffor循环时,其复杂度应为平方级别,立方级别 -
当遇到较复杂的程序时,其运行时间取决于执行最频繁的语句(e.g.:三重for循环时间主要取决于最内层的语句)
相当于说办事情要抓主要矛盾了哈哈
其他常见描述时间复杂的增长数量级&举例
推算和证明用到一点求极限和基础数学知识,不是本文讨论的重点,故只列出结果
- 常数级别
- 对数 :典型的二分查找
- 线性对数 典型并归排序
- 指数级别(只在某些特殊问题上有讨论价值,不能用于解决大问题,太慢)