算法 即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。
就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。
“条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法“更好”。
算法VS程序
很多人误以为程序就是算法,其实不然:算法是解决某个问题的想法、思路;而程序是在心中有算法的前提下编写出来的可以运行的代码。
例如,要解决依次输出一维数组中的数据元素的值的问题,首先想到的是使用循环结构( for 或者 while ),在有这个算法的基础上,开始编写程序。
所以,算法相当于是程序的雏形。当解决问题时,首先心中要有解决问题的算法,围绕算法编写出程序代码。
有算法一定能解决问题吗?
对于一个问题,想出解决的算法,不一定就能解决这个问题。
例如拧螺母,扳手相对于钳子来说更好使(选择算法的过程),但是在拧的过程(编写程序的过程)中发现螺母生锈拧不动,这时就需要另想办法。
为了避免这种情况的发生,要充分全面地思考问题,尽可能地考虑到所有地可能情况,慎重选择算法(需要在实践中不断地积累经验)。
“好”算法的标准
对于一个问题的算法来说,之所以称之为算法,首先它必须能够解决这个问题(称为准确性)。其次,通过这个算法编写的程序要求在任何情况下不能崩溃(称为健壮性)。
如果准确性和健壮性都满足,接下来,就要考虑最重要的一点:通过算法编写的程序,运行的效率怎么样。
运行效率体现在两方面:
- 算法的运行时间。(称为“时间复杂度”)
- 运行算法所需的内存空间大小。(称为“空间复杂度”)
好算法的标准就是:在符合算法本身的要求的基础上,使用算法编写的程序运行的时间短,运行过程中占用的内存空间少,就可以称这个算法是“好算法”。
时间复杂度的表示
算法的时间复杂度的表示方式为:
O(频度)
这种表示方式称为大“O”记法。
注意,是大写的字母O,不是数字0。
像我们平常的Java代码中
int i = 1;
++i;
System.out.println(i);
这样他的时间复杂程度就是最简单的O(1),也就是从1变成2的过程。
for (int i = 0; i <= n ; i++) {
}
而这样一个for循环的时间复杂程度就是O(n),可想如果是两个for循环的话,那么就是O(n²)。
算法中一些简化的原则:
- 保留最高项。如:(n²+n) 可以变成n²
- 去掉系数。如:(3n) 可以变成n
- 去常量。如:(3n+6+9)可以变成n
常用的时间复杂度的排序
列举了几种常见的算法时间复杂度的比较(从小到大):
比较公式: O(logN) < O(N) ∈ N(logN) < O(N²)
拿时间换空间,用空间换时间
算法的时间复杂度和空间复杂度是可以相互转化的。
谷歌浏览器相比于其他的浏览器,运行速度要快。是因为它占用了更多的内存空间,以空间换取了时间。
算法中,例如判断某个年份是否为闰年时,如果想以时间换取空间,算法思路就是:当给定一个年份时,判断该年份是否能被4或者400整除,如果可以,就是闰年。
如果想以空间换时间的话,判断闰年的思路就是:把所有的年份先判断出来,存储在数组中(年份和数组下标对应),如果是闰年,数组值是1,否则是0;当需要判断某年是否为闰年时,直接看对应的数组值是1还是0,不用计算就可以马上知道。
来源:CSDN
作者:枕上~诗书闲
链接:https://blog.csdn.net/qq_43705670/article/details/104651343