算法的定义
对特定问题求解方法和步骤的一中描述,他是指令的有限序列。其中每个指令表示一个或多个操作
算法的描述:
自然语言:中文、英语
流程图:传统流程图、NS流程图
伪代码:类语言:类C语言
程序代码:C语言程序、JAVA语言程序
算法与程序
算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法
程序是用某种程序设计语言对算法的具体实现
程序=数据结构+算法
数据结构通过算法实现操作
算法根据数据结构设计程序
算法特性:一个算法必须具备以下五个重要特性
1、有穷性:一个算法必须总在执行又穷步之后结束,且每一步都在有又穷的时间内完成
2、确定性:算法中的每一条指令都必须有确切的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出
3、可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现
4、输入:一个算法有零个或多个输入
5、输出:一个算法有一个或多个输出
算法设计的要求
1、正确性:程序对于精心选择的、典型、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果
2、可读性:算法主要是为了人的阅读和交流,其次才是为计算机执行,以此算法应该易于人的理解
另一方面,晦涩难读的算法易于隐藏较多错误而难以调试
3、健壮性:指当输入非法数据时,算法恰当的做出反应或进行相应的处理,而不是产生莫名其妙的输出结果
处理出错的方法,不应该中断程序的执行,而应是返回一个表示错误的信息或错误性质的值,以便于在更高的抽象层次上进行处理
4、高效性:要求花费尽量少的时间和尽量低的存储需求
算法的效率以下两个方面考虑:
时间效率:指的是算法所耗费的时间
算方时间效率的度量:算法时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量
两种度量方法:
1、事后统计:将算法实现,测算其时间和空间开销
缺点:编写程序实现算法将花费较多的时间和精力;所得实验结果依赖于计算机的软硬件等环境因素,掩盖算法本身的优劣
2、事前分析:对算法所消耗资源的一种估算方法
事前分析方法
一个算法的运行时间是指一个算法在计算机上运行所消耗的时间大致可以等于计算机执行一种简单的操作(如赋值、比较、移动等)所需的时间与算法中进行的简单操作次数乘积
算法运行时间=一个简单操作所需的时间×简单操作次数
若有某个辅助函数f(n),使得当n趋近于无穷大是,T(n)f(n)的极限为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度
一般情况下,不必计算所有操作的执行次数,而只是考虑算法中基本操作执行的次数,他是问题规模n的某个函数,用T(n)表示
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n)=O(f(n))
他表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,成渐进时间复杂度
计算时间复杂度的方法
1、找出语句频度最大的那条语句作为基本语句
2、计算基本语句的频度得到的问题规模n的某个函数f(n)
3、取其数量级用符号“O”表示
最坏时间复杂度:指在最坏的情况下,算法的时间复杂度
平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间
最好时间复杂度:指在最好的情况下,算法的时间复杂度
一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比他更长
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度
1、加法规则
T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))
乘法法则:
T(n)=T1(n)×T2(n)=O(f(n))+O(g(n))=O(f(n)×g(n))
当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊
复杂度:
常数阶<对数阶<线性阶<线性对数阶<平方阶<立方阶<……<k次方阶<指数阶
2、空间效率:指的是算法执行过程中所耗费的存储空间
时间效率和空间效率有时候是矛盾的
空间效率
空间复杂度:算法所需存储的空间
记作:S(n)=O(f(n))
其中n为问题的规模(大小)
算法要占据的空间
1、算法本身要占据的空间,输入/输出,指令,常数,变量等
2、算法要使用的辅助空间
抽象数据类型=数据的逻辑结构+抽象运算(运算的功能描述)