算法
1、概念
算法是求解特定问题的描述,是一步步解决问题的一种方法。
2、如何评价算法的好坏
算法的好坏即算法的运行效率怎么样,这里就要涉及到两个方法
①事后统计法
事后统计法是通过设计好的程序和数据,利用计算机的运行时间进行比较算法的时长来确定算法的好坏
弊端:
- 必须事先编好程序,如果数据要处理大量的数据,则会浪费掉很多时间。
- 时间的比较依赖于计算机的硬件和软件环境
- 算法的测试数据设计困难,不能保证运算的高效率,设计的量小,体现不了算法的优越性,设计的数据大,会耗费很多时间。
②事前分析法
事前分析法是在编程之前,依据统计方法对算法进行估算
程序在计算机上运行的时间取决于以下几点:
- 算法采用的策略、方法
- 编译产生的代码质量。
- 问题的输入规模
- 机器执行指令的速度
3、算法时间复杂度
算法的时间复杂度讨论的是算法的输入规模N的数量级,不是算法的具体执行次数。
①常数阶O(1)
常数阶指的是无循环、无递归,与输入问题规模无关的代码。
如图时间复杂度随着问题规模的增加不变的代码复杂度就是常数阶。
②线性阶O(n)
线性阶与问题输入规模有关,主要形式就是一层循环的代码。如图:
③线性阶O(n+m)
这个和O(n)一样,只不过我们有两种数据的输入规模。例如:
int n = 100;
int m = 100;
for(int i =1;i<n;i++){
System.out.println(i);
}
for(int i = 1;i<m;i++){
System.out.println(i)
}
上述代码是并列的连个循环,但是也应该是线性阶。
④平方阶O(n²)、O(nm)
平方阶就涉及到了嵌套循环,如下所示:
int n = 100;
for(int i =1;i<n;i++){
for(int j =1;j<n;j++){
System.out.println(i+j);
}
}
如上所示是一个嵌套循环,说明它的时间复杂度是平方阶。我们再增加一下输入规模,如下:
int n =10;
int m =20;
for(int i = 1;i<n;i++){
for(int j = 1;j<m;j++){
System.out.pintln(n+m);
}
}
伴随着输入规模的增加,平方阶自然就变成了O(nm)。
⑤ 对数阶
对数阶是与问题输入规模有关的,正如对数图像所示,问题规模越大,时间在增长但是不是太激烈。
总结
常见的阶如下所示:
他们各自对应的图像比较也比较清晰:
这样我们在事前分析的时候也能大概分析下问题的时间复杂度。