算法时间复杂度和空间复杂度

陌路散爱 提交于 2020-03-04 23:47:07

算法 即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。

就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。

“条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法“更好”

算法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²)。

算法中一些简化的原则:

  1. 保留最高项。如:(n²+n) 可以变成n²
  2. 去掉系数。如:(3n) 可以变成n
  3. 去常量。如:(3n+6+9)可以变成n

常用的时间复杂度的排序

列举了几种常见的算法时间复杂度的比较(从小到大):

比较公式: O(logN) < O(N) ∈ N(logN) < O(N²)

时间复杂程度图

拿时间换空间,用空间换时间

算法的时间复杂度和空间复杂度是可以相互转化的。

谷歌浏览器相比于其他的浏览器,运行速度要快。是因为它占用了更多的内存空间,以空间换取了时间。

算法中,例如判断某个年份是否为闰年时,如果想以时间换取空间,算法思路就是:当给定一个年份时,判断该年份是否能被4或者400整除,如果可以,就是闰年。

如果想以空间换时间的话,判断闰年的思路就是:把所有的年份先判断出来,存储在数组中(年份和数组下标对应),如果是闰年,数组值是1,否则是0;当需要判断某年是否为闰年时,直接看对应的数组值是1还是0,不用计算就可以马上知道。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!