算法的特性、算法设计的要求、算法效率的度量方法
第二章 算法
算法具有五个基本特性:
输入、输出、有穷性、确定性和可行性
1)输出,可以有另个或多个
2)输出,一定要有,一个或多个
3)有穷性:算法在执行有限的步骤后,自动结束而不会出现无限循环,而且每一个步骤在可接受的时间内完成。
4)确定性:算法的每一个步骤都具有确定的含义,不会出现二义性。
5)可行性:每一步都必须是可行的。
算法设计的要求:(好算法)
1)正确性:算法至少应该具有输入、输出和加工处理无歧义性、能正确放映问题的需求、能够得到问题的正确答案。
2)可读性:便于阅读、理解和交流。
3)健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。
4)时间效率高和存储量低:即算法执行的时间和算法执行的过程中需要的最大存储空间(算法程序运行时所占用的内存或外部硬盘存储空间。 )
算法效率的度量方法:
1)事后统计方法:通过设计好的测试程序和数据,利用 计算机计数器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。(缺陷多,不予考虑)
2)事前分析估算方法:在计算机程序编制之前,依据统计方法对算法进行估算。
一个高级程序设计语言编写的程序在计算机上运行所消耗的时间取决于下列因素:
1、算法采用的策略、方法(根本)@@@
2、编译产生的代码质量(软件)
3、问题的输入规模(即输入量的多少)@@@
4、机器执行指令的速度(硬件性能)
函数的渐进增长:
判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数。
通过算法实践复杂度来估计算法时间效率。
算法时间复杂度:
T(n)=O(f(n))表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。其中f(n)是问题规模n的某个函数。(大O记法)
一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。
O(1)叫常数阶、O(n)叫线性阶、O(n2)叫平方阶。
推导大O阶方法(如何分析算法的时间复杂度)
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项相乘的常数。
得到的结果就是大O阶。
常见的时间复杂度
常用的时间复杂度所耗费的时间从小到大依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
算法空间复杂度
S(n)=O(f(n)) n为问题的规模,f(n)为语句关于n所占存储空间的函数
摘录自:《大话数据结构》程杰