算法与算法分析
-
算法的定义
对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。
-
算法的描述
-
自然语言:英语、中文(麻烦)
-
流程图:传统流程图(框图)——开始结束用圆角矩形,输入输出用平行四边形,操作用矩形,判断用菱形
NR
流程图(盒图) -
伪代码:类语言——类C语言
-
程序代码:C语言程序、Java语言程序
-
-
算法与程序
-
算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法
-
程序是用某种程序设计语言对算法的具体实现
程序=数据结构+算法 数据结构通过算法实现操作 算法根据数据结构设计程序
-
-
算法特性:一个算法必须具备以下五个重要特性
-
有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成
-
确定性:算法中每一条指令必须有确切的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出
-
可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现
-
输入:一个算法有零个或多个输入
-
输出:一个算法有一个或多个输出
-
-
算法设计的要求
-
正确性
-
可读性
-
健壮性
-
高效性
-
-
算法效率
-
时间效率
-
空间效率
-
时间效率和空间效率有时候是矛盾的,需要结合具体要求综合的平衡考虑
-
-
-
算法效率度量
-
事前分析: 算法运行时间=∑每条语句的执行次数(语句频度)*该语句执行一次所需时间
-
算法时间复杂度
T(n)=
2n³+3n²+n+1
当n->∞ 时 得到f(n)=n³ T(n)=O(n³)
算法的渐进时间复杂度:T(n)=O(f(n)) (O是数量级的符号)
-
找出语句频度最大的那条语句作为基本语句
-
计算基本语句的频度得到问题规模n的某个函数f(n)
-
取其数量级用符号O表示
-
时间复杂度是由嵌套最深层语句的频度决定的
-
直接看循环体更简单
x=0; y=0; for(int k=0;k<n;k++) //n+1 x++; //n for(int i=0;i<n;i++) //n+1 for(int j=0;j<n;j++) //n*(n+1) n*n f(n)=n*n y++; //n*n
1 i=1; 2 while(i<=n) 3 i=i*2; 4 /*i=2 5 i=2*2 6 i=2*2*2 7 …… 8 i=2^x 9 执行次数x 10 i<=n 则 2^x<=n 11 x<=log2^n 12 f(n)=x=log2^n 13 T(n)=O(log2^n) 或O(logn) 14 */
-
最坏时间复杂度
-
平均时间复杂度
-
最好时间复杂度
-
算法空间复杂度
将一维数组a中的n个数逆序存放到原数组中
1 for(i=0;i<n/2;i++){ 2 t=a[i]; 3 a[i]=a[n-i-1]; 4 a[n-i-1]=t; 5 } // S(n)=O(1) 原地工作
1 for(i=0;i<n;i++) 2 b[i]=a[n-i-1]; 3 for(i=0;i<n;i++) 4 a[i]=b[i]; // S(n)=O(n)
-
-
-
事后分析:将算法实现去测算
缺点:依赖于计算机软硬件等环境因素影响
-