第二节 算法

一个算法应该具备以下 5 个特性:
1.有穷性(Finity):一个算法总是在执行有穷步之后结束。
2.确定性(Unambiguousness):算法的每一个步骤都必须有确切的含义,对于相同的输入只能有相同的输出。
3.输入(Input):一个算法具有零个或多个输入。
4.输出(Output):一个算法具有一个或多个输出。
5.能行性(realizability):算法中的每一步都可以通过已经实现的基本运算的有限次运行来实现。

评价一个算法优劣的主要标准如下:
1.正确性(Correctness)。
2.可读性(Readability)。算法主要是为了人阅读和交流,其次才是机器的执行。一个可读性强的算法也有助于对算法中隐藏错误的排除和算法的移植。
3.健壮性(Robustness)。一个算法应该具有很强的容错能力。
4.运行时间(Running Time)。运行时间是指算法在计算机上运行所花费的时间,一般来说,执行时间越短,性能越好。
5.占用空间(Storage Space)。占用空间是指算法在计算机上存储所占用的存储空间,包括存储算法本身所占用的存储空间、算法的输入及输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间。算法占用的存储空间是指算法执行过程中所需要的最大存储空间。实际上,算法的时间效率和空间效率经常是一对矛盾,相互抵触。

通常把算法在运行过程中临时占用的存储空间的大小叫算法的空间复杂度(Space Complexity)。算法的空间复杂度比较容易计算,它主要包括局部变量所占用的存储空间和系统为实现递归所使用的堆栈占用的存储空间。

计算机的性能由以下因素决定:
1、 硬件。
2、 实现算法所使用的计算机语言。实现算法的语言级别越高,其执行效率相对
越低。
3、 所使用的语言的编译器/解释器。一般而言,编译的执行效率高于解释,但解释具有更大的灵活性。
4、 操作系统。

为了便于比较同一问题的不同算法,通常把算法中基本操作重复执行的次数(频度)作为算法的时间复杂度。算法中的基本操作一般是指算法中最深层循环内的语句。
算法中基本操作语句的频度是问题规模n的某个函数f(n),记作:T(n)=O(f(n))。其中“O”表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,或者说,用“O”符号表示数量级的概念。
如果一个算法没有循环语句,则算法中基本操作的执行频度与问题规模n无关,记作O(1),也称为常数阶。如果算法只有一个一重循环,则算法的基本操作的执行频度与问题规模n呈线性增大关系,记作O(n),也叫线性阶。常用的还有平方阶O(n2)、立方阶O(n3)、对数阶O(log2n)等。

例:
T(n)=1/2n(n-1)
1/2n²-1/2n的数量级与n²相同(数量级只看最高次幂)
所以T(n)=0(n²)

posted @ 2016-05-18 11:55  贴心小冰棍  阅读(201)  评论(0编辑  收藏  举报