算法和性能分析

数据结构与算法是程序设计实践中最基本的内涵。程序能否快速而有效地完成预定的任务,取决于是否选对数据结构,而程序是否能清楚而正确地把问题解决,则取决于算法。

  • 算法

算法(Algorithm)是指令的集合,是为了解决特定问题而规定的一系列操作。它是明确定义的可计算过程,以一个数据集合作为输入,并产生一个数据集合作为输出。

算法5项特性:

1、输入(Input):0 个或多个输入数据,这些输入必须有清楚的描述或定义。

2、输出(Output):至少会有一个输出结果,不可以没有输出结果。

3、明确性(Definiteness):每一个指令或步骤必须是简洁明确的。

4、有限性(Finiteness):在有限步骤后一定会结束,不会产生无限循环。

5、有效性(Effectiveness):步骤清楚且可行,能让用户用纸笔计算而求出答案。

  • 算法效能分析

对一个程序(或算法)效能的评估,经常是从时间与空间两种因素来进行考虑的。时间方面是指程序的运行时间,称为时间复杂度(Time Complexity)。空间方面是指程序在计算机内存所占的空间大小,称为空间复杂度(Space Complexity)。

    • 时间复杂度

在一个完全理想状态下的计算机中,我们定义T(n)来表示程序执行所要花费的时间,其中n代表数据输入量。当然程序的运行时间(Worse Case Executing Time)或最大运行时间是时间复杂度的衡量标准,一般以 Big-oh 表示。

由于分析算法的时间复杂度必须考虑它的成长比率(Rate Of Growth),往往是一种函数,而时间复杂度本身也是一种"渐近表示"(Asymmetric Notation)。

    • Big-oh

O(f(n))可视为某算法在计算机中所需运行时间不会超过某一常数倍的f(n),也就是说当某算法的运行时间T(n)的时间复杂度(time complexity)为O(f(n))(读成big-oh of f(n)或order is f(n)),意思是存在两个常数 c 与 n0,则若n >= n0,则 T(n)

      • 常见Big-oh

时间复杂度只是执行次数的一个概略的量度层级,并非真实的执行次数。

Big-oh是一种用来表示最坏运行时间的表现方式,它也是最常用于描述时间复杂度的渐近式表示法。

常见的Big-oh有下列几种:

算法和性能分析_第1张图片

算法和性能分析_第2张图片

对于n >= 16 时,时间复杂度比较如下:

    • Ω(omega)

Ω也是一种时间复杂度的渐近表示法,如果说Big-oh是运行时间量度的最坏情况,那么Ω就是运行时间量度的最好状况。

Ω的定义:对f(n) = Ω(g(n))(读作big-omega of g(n)),意思是存在常数c和n0,对所有的n值而言,n>=n0时,f(n)>=cg(n)均成立。

    • θ(theta)

θ是一种比Big-O与Ω更精确的时间复杂度渐近表示法。

θ的定义:f(n)=θ(g(n))(读作big-theta of g(n)),意思是存在常数c1、c2、n0,对所有的n>=n0时,c1g(n)

你可能感兴趣的:(算法)