①事后分析估算方法:
通过给算法执行过程中添加count,运行一次count+1,直到算法结束,count的值就是此算法的时间复杂度。
或利用函数库自带的计时器函数,如
算法前查看起始时间
long start = System.currentTimeMillis();
算法运行后再查看时间
long end = System.currentTimeMillis();
最后打印时间差值得出时间复杂度
System.out.println(end-start);
缺点在于:
必须依据算法实现编制好的测试程序,可能浪费时间后得到的是一个糟糕的算法。
②事前分析估算方法:
现一个高级语言编写的程序程序在计算机 上运行所消耗的时间取决于下列因素:
1.算法采用的策略与方案;
2.编译产生的代码质量;
3.问题的输入规模;
4.机器执行指令的速度;
如果我们要精确的研究循环的条件执行了多少次,是一件很麻烦的事情,并且,由于真正计算和的代码是内循环的循环体,所以,在研究算法的效率时,我们只考虑核心代码的执行次数,这样可以简化分析。
假设四个算法的输入规模都是n:
1.算法A1需要做2n+3次操作
2.算法A2需要做2n次操作
3.算法B1需要做3n+1次操作
4.算法B2需要做3n次操作
通过数据表格,比较算法A1和算法B1:
当输入规模n=1时,A1需要执行5次,B1需要执行4次,所以A1的效率比B1的效率低;
当输入规模n=2时,A1需要执行7次,B1需要执行7次,所以A1的效率和B1的效率一样;
当输入规模n>2时,A1需要的执行次数一直比B1需要执行的次数少,所以A1的效率比B1的效率高;
当输入规模n>2时,算法A1的渐近增长小于算法B1 的渐近增长 通过观察折线图,我们发现,随着输入规模的增大,算法A1和算法A2逐渐重叠到一块,算法B1和算法B2逐渐重叠 到一块,所以我们得出结论:
随着输入规模的增大,与最高次项相乘的常数可以忽略。
假设四个算法的输入规模都是n:
1.算法C1需要做4n+8次操作
2.算法C2需要做n次操作
3.算法D1需要做2n^2次操作
4.算法D2需要做n^2次操作
通过数据表格,对比算法C1和算法D1:
当输入规模n<=3时,算法C1执行次数多于算法D1,因此算法C1效率低一些;
当输入规模n>3时,算法C1执行次数少于算法D1,因此,算法D2效率低一些,
所以,总体上,算法C1要优于算法D1.
通过折线图,对比对比算法C1和C2:
随着输入规模的增大,算法C1和算法C2几乎重叠 通过折线图,对比算法C系列和算法D系列:
随着输入规模的增大,即使去除n^2前面的常数因子,D系列的次数要远远高于C系列。
因此,可以得出结论:
随着输入规模的增大,与最高次项相乘的常数可以忽略
假设四个算法的输入规模都是n:
1.算法E1: 2n^2+3n+1;
2.算法E2: n^2
3.算法F1: 2n^3+3n+1
4.算法F2: n^3
通过数据表格,对比算法E1和算法F1:
当n=1时,算法E1和算法F1的执行次数一样;
当n>1时,算法E1的执行次数远远小于算法F1的执行次数;
所以算法E1总体上是由于算法F1的。
通过折线图我们会看到,算法F系列随着n的增长会变得特块,算法E系列随着n的增长相比较算法F来说,变得比较 慢,所以可以得出结论:
最高次项的指数大的,随着n的增长,结果也会变得增长特别快
假设五个算法的输入规模都是n:
1.算法G: n^3;
2.算法H: n^2;
3.算法I: n:
4.算法J: logn
5.算法K
通过观察数据表格和折线图,很容易可以得出结论:
算法函数中n最高次幂越小,算法效率越高
总上所述,在我们比较算法随着输入规模的增长量时,可以有以下规则:
1.算法函数中的常数可以忽略;
2.算法函数中最高次幂的常数因子可以忽略;
3.算法函数中最高次幂越小,算法效率越高。
标签:分析,复杂度,规模,A1,算法,B1,执行,输入 From: https://www.cnblogs.com/rubiaaa/p/16708885.html