算法的基本概念
计算机所进行的一切操作都是由程序决定的,程序是由人们事先编好并输入计算机的。
一个程序包括以下两方面的内容:
-
对数据的描述:在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式,即数据结构
-
对操作的描述:对数据进行操作的方法和步骤的描述,也就是算法,算法用于解决“做什么”和“怎么做”的问题。
数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。著名的计算机科学家沃思曾提出一个公式:
算法+数据结构=程序
算法是程序的核心
算法具有以下特性:
- 输入:在算法中可以有零个或者多个输入
- 输出:在算法中至少有一个输出。由于算法需要给出解决特定问题的结果,没有输出的算法是毫无意义的
- 有穷性:任意一个算法在执行有穷个计算步骤后必须终止
- 确定性:算法的每一个步骤必须具有确切的定义,不能有二义性
- 可行性:算法的每一步都必须是可行的
算法复杂度的概念和意义
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适的算法。对一个算法的评价主要从时间复杂度和空间复杂度来考虑,这也是提升应用程序质量的落脚点。
算法的时间复杂度
时间频度
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比,算法中哪个语句执行次数多,它花费的时间就多。一个算法中的语句执行次数称为语句频度或时间频度
时间复杂度
在刚才提到的时间频度中,n为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引人时间复杂度概念。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐近时间复杂度,简称时间复杂度。
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为(1)。另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1,它们的频度不同,但时间复杂度相同,都为 O(n2)。随着问题规模n和时间复杂度不断增大,算法的执行效率随之降低。
常见的算法时间复杂度由小到大依次为:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<…<O(2n)<O(n!)
算法的空间复杂度
与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量
算法执行期间所需要的存储空间包括3个部分:
- 算法程序所占的空间。
- 输入的初始数据所占的存储空间。
- 算法执行过程中所需要的额外空间。
在许多实际问题中,为了减少算法所占的存储空间,通常采用压缩存储技术