算法分析:时间和空间复杂度

算法分析:时间和空间复杂度

一、什么叫算法

算法(Algorithm):是对特定问题求解方法或步骤的一种描述。一个算法可以用多种方法描述,主要有:

  • 使用自然语言描述;
  • 使用形式语言描述;
  • 使用计算机程序设计语言描述。

注:算法和程序是两个不同的概念。一个计算机程序是对一个算法使用某种程序设计语言的具体实现。

算法一般具有以下五个特性:

  • 输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象集合。
  • 输出:一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。
  • 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
  • 确定性:算法中每一条指令必须有确切的含义,不存在二义性。
  • 可行性:算法描述的操作都可以通过已经实现的基本运算执行有限次来实现。

二、什么叫好算法

评价一个好的算法有以下几个标准:

  • 正确性(Correctness):算法应满足具体问题的需求。
  • 可读性(Readability):算法应容易供人阅读和交流,方便理解和修改。
  • 健壮性(Robustness):算法应具有容错处理。当输入非法或错误数据时,算法应能适当地作出反应或进行处理,而不会产生莫名其妙的输出结果。
  • 通用性(Generality):算法应具有一般性 ,即算法的处理结果对于一般的数据集合都成立。
  • 效率与存储空间需求: 效率指的是算法执行的时间;存储空间需求指算法执行过程中所需要的最大存储空间。一般这两者与问题的规模有关。

三、算法的时间复杂度

算法分析:时间和空间复杂度

算法中基本操作重复执行的次数是问题规模n的某个函数,其时间量度记作:T(n)=O(f(n)),称作算法的渐近时间复杂度(Asymptotic Time complexity),简称时间复杂度。一般地,常用最深层循环内的语句中的原操作的执行频度(重复执行的次数)来表示。

表示时间复杂度的阶有:

  • O(1):常量时间阶
  • O(n):线性时间阶
  • O(logn):对数时间阶
  • O(n*logn):线性对数时间阶
  • O (n^k):k≥2,k次方时间阶

例:两个n阶方阵的乘法

算法分析:时间和空间复杂度

两个n阶方阵的乘法

由于是一个三重循环,每个循环从1到n,则总次数:n * n * n=n^3,时间复杂度为T(n)=O(n^3)。

下面六种计算算法时间的多项式是最常用的。其关系为:

O(1) < O(logn) < O(n) < O(n*logn) < O(n^2) < O(n^3)

指数时间的关系为:

O(2^n) < O(n!) < O(n^n)

当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。因此,只要有人能将现有指数时间算法中的任何一个算法化简为多项式时间算法,那就取得了一个伟大的成就。

四、算法的空间复杂度

空间复杂度(Space complexity):是指算法编写成程序后,在计算机中运行时所需存储空间大小的度量。记作:S(n) = O(f(n)),其中:n为问题的规模或大小。

存储空间一般包括三个方面:

  • 输入数据所占用的存储空间;
  • 指令常数变量所占用的存储空间;
  • 辅助(存储)空间。
算法分析:时间和空间复杂度

一般地,算法的空间复杂度指的是辅助空间。如:

  • 一维数组a[n]:空间复杂度 O(n)
  • 二维数组a[n][m]:空间复杂度 O(n*m)


分享到:


相關文章: