算法效率分析

算法效率分析

算法定义

程序 = 数据结构 + 算法

算法:是对特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作

程序是计算机指令的有序集合,是算法用某种程序设计语言的表述,是算法在计算机上的具体实现

算法的特性

(1) 有穷性:一个算法必须在执行有穷步之后结束,且每一步都可在有穷时间内完成(算法必须是有穷的,程序可以是无穷的)

(2) 确定性:算法中的每条指令必须有确切的含义,对于相同的输入只能得到相同的输出,不会出现二义性

(3) 有零个或多个输入:在执行算法时需要从外界取得必要的信息

(4) 有一个或多个输出:算法的目的是为了求解,“ 解 ”就是输出

(5) 可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成

算法设计的要求

(1) 正确性:指算法至少应该具有输入、输出和加工处理无歧义性、能正确得到问题的正确答案

(2) 可读性:算法设计的另一目的是为了便于阅读,理解和交流

(3) 健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果

(4) 高效性时间效率高和存储量低(时间复杂度低和空间复杂度低)

算法时间效率的度量

根据该算法编制的程序在计算机上执行时所消耗的时间来度量,度量一个程序的执行时间通常有两种方法:

  1. 事后统计估计:让算法先运行,事后统计其执行时间

  2. 事前分析估计:认为算法的执行时间是问题规模 n 的函数,用 T(n) 表示

一个程序的运行时间依赖于算法的好坏问题的输入规模

$$算法运行时间 = \sum每条语句的执行次数*该语句一次所执行的时间$$

  • 一般情况下,算法中基本语句重复执行的次数是问题规模 n 的某个函数 f(n),算法的时间量度记作T(n) = O(f(n))
  • 它表示随问题规模 n 的增大,算法执行时间的增长率和 f(n) 的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度

基本方法:
找出语句频度最大的那条语句作为基本语句
计算基本语句的频度得到问题规模 n 的某个函数 f(n)
取其数量级用符号 “ O ” 表示

注意:算法中基本操作重复执行的次数还随问题的输入数据集不同而不同

时间复杂度的计算方法

对于复杂的算法,可以将它分为几个容易估算的部分,然后利用加法法则乘法法则,计算算法的时间复杂度

最坏时间复杂度是指在最坏情况下,算法的时间复杂度

平均时间复杂度是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间

最好时间复杂度是指在最好情况下,算法的时间复杂度

一般总是考虑最坏情况时间复杂度,以保证算法的运行时间不会比它更长

加法法则

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))

注意:常见的时间复杂度(自上向下越来越大)

时间复杂度 术语
O(1) 常数阶
O(log2n) 对数阶
O(n) 线性阶
O(nlog2n) nlogn阶
O(n^2) 平方阶
O(n^3) 立方阶
O(2^n) 指数阶
O(n!) 阶乘阶
O(n^n)` 幂指阶

算法空间效率的度量

我们用 “ 时间复杂度 ” 指运行时间的需求, “ 空间复杂度 ” 指空间的需求

作为算法所需存储空间的度量,简称空间复杂度,它也是问题规模 n 的函数,记作:S(n) = O(f(n))

算法占据的空间:

  • 算法本身要占据的空间,输入 / 输出,指令,常数,变量等
  • 算法要使用的辅助单元的个数(算法的空间复杂度一般指辅助单元的空间大小)

若算法中新建了几个与输入数据规模 n 相同的辅助数组,则空间复杂度为O(n)
算法原地工作是指算法所需的辅助空间为常量,即为O(1)

posted @ 2024-09-09 15:45  魏图图  阅读(5)  评论(0编辑  收藏  举报