1.算法
1.1算法的定义
算法是对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。算法就是解决问题的方法和步骤。
算法的描述:
-
自然语言:中,英文
-
流程图:传统流程图,NS流程图
-
伪代码,类语言:类C语言
-
程序代码:C语言程序,Java语言程序…
算法与程序:
- 算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。
- 程序是用某种程序设计语言对算法的具体实现。
程序 = 数据结构 + 算法
- 数据结构通过算法实现操作
- 算法根据数据结构设计程序
1.2算法的特性
- 有穷性:必须总是在执行有限步骤后结束,且每步都在有限时间内完成。
- 确定性:其中的每条指令必须有确切含义,没有歧义,在任何条件下,只有一条执行路径,即对于相同的输入只能得到相同的输出。
- 可行性:算法必须可执行,算法描述的操作可通过已实现的基本操作执行有限次数来实现。
- 输入:有零个或多个输入。
- 输出:有零个或多个输出。
1.3算法设计的要求
-
正确性:算法满足问题要求,能正确解决问题。
-
可读性:算法应该易于人的理解。
-
健壮性:当输入非法数据时,算法恰当的做出反应进行相应处理,处理出错的方法应该有效,不能是中断程序的执行。
-
高效性:算法应该花费尽量少的时间和尽量低的存储需求。
2.算法分析
2.1算法时间效率的度量
-
算法时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量。
-
算法中每条语句的频度之和:即算法所耗费的时间。
常数操作:与数据量无关(操作时间固定)的操作叫做常数操作。
例:求a+b的值,结果是固定的,且与数据量无关。
2.2时间复杂度
时间复杂度:时间复杂度为一个算法流程中,常数操作数量的一个指标,常用O(读作big O)来表示,其在数学上指的是上限的意思。即对自己非常熟悉的一个算法中去总结出常数操作数量的表达式。**在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果为f(N)(即N相关的函数),那么时间复杂度为O(f(N)),也称为O(f(N))的算法。**评价一个算法流程的好坏,先看时间复杂度的指标,当指标无法区分时,再去分析不同数据样本下的实际运行时间,也就是“常数项时间”。
例:把一个数组按照从小到大排序,即进行选择排序,在数组范围中遍历出它的最小值,然后与0位置上的数进行交换,直到排好整个数组。
最后对算法流程进行估计可以知道一共进行了aN2+bN+c**次常数操作,按照时间复杂度的定义可知此处的时间复杂度为**O(N2)。
算法中的基本语句:算法中执行次数最多的语句,计算时间复杂度时只考虑基本操作执行的次数。
分析算法时间复杂度的基本方法:
- 找出语句频度最大的那条语句作为基本语句
- 计算基本语句的频度得到问题规模n的某个函数f(n)
- 取其数量级用符号“O”表示
时间复杂度室友嵌套最深层语句的频度决定的(找嵌套在循环语句中的语句)
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度:
-
加法规则:
T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n)))
-
乘法规则:
T(n) = T1(n) x T2(n) = O(f(n)) x O(g(n)) = O(f(n)xg(n))
时间复杂度T(n)按数量级递增顺序为:
3.空间复杂度
空间复杂度:算法所需存储空间的度量,记作:S(n) = O(f(n)),其中n为问题的规模(或大小),空间复杂度越小,算法越好(按数量级递增顺序与时间复杂度相同)。
算法要占据的空间:
- 算法本身占据的空间:输入/输出,指令,常数,变量等
- 算法要使用的辅助空间