1.算法时间复杂度分析
事后分析估算法(不常用)
利用计算机计时器对不同算法编制的程序运行时间进行比较,花费大量时间和精力判断,不同的测试硬件环境差别导致结果差异很大。
public static void main(String[] args){
long start = System.currentTimeMillis();
//算法
long end = System.currentTimeMillis();
System.out.println(end-start);
}
事前分析估算法
总结发现,程序在计算机上运行消耗的时间取决如下因素:
1.算法采用的策略方案
2.编译产生的代码质量
3.问题的输入规模
4.机器执行指令的速度
由此我们可以发现,如果算法固定抛开计算机与软件的有关的因素,该算法执行时间就只和问题的输入规模有关系
在研究算法的效率时,我们只考虑核心代码的执行次数,简化分析(不计算循环,变量声明,打印等操作)最重要的是把核心操作次数和输入规模关联起来。
结论:
1.算法函数中的常数可以忽略
2.算法函数中最高次幂的常数因子可以忽略
3.算法函数中最高次幂越小,算法效率越高
大O记法表示时间复杂度 O()
有以下规则:
1用常数1取代运行时间中的所有加法常数
2在修改后的运行次数中,只保留高阶项
3如果最高阶项存在,且常数因子不为1,则除去与这个项相乘的常数
算法中常见的大O阶
1.线性阶O(n)
2.平方阶O(n^2),双层嵌套循环
3.立方阶O(n^3),三层嵌套循环
4.对数阶O(logn)
5.常数阶O(1)
复杂程度从低到高依次为:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)
最坏情况
我们要保证在最坏的情况程序也能正常运行,所以算法时间复杂度一般考虑最坏情况。