渐进算法分析(简称算法分析)详解

本篇文章将要介绍:

文章目录

    • 1、什么是算法分析
    • 2、算法分析专有名词
    • 3、渐进算法分析
        • a)、时间复杂度化简规则
        • b)、如何得到算法的增长率
        • c)、两个函数的增长率比较
    • 4、渐进算法分析的局限性
    • 5、算法分析扩展
        • a)、问题的代价分析
        • b)、空间代价
        • c)、空间时间权衡原则
        • d)、基于磁盘的空间/时间权衡规则

1、什么是算法分析

要明确算法分析这个概念,就要知道计算机程序设计的两个核心目标:

  1. 程序员角度:设计一种容易理解、编码和调试的算法
  2. 计算机角度:设计一种能有效利用计算机资源的算法

算法分析就是从计算机角度分析,是对一个算法需要多少计算时间和存储空间作定量的分析。它可以估算出当问题规模变大时,一种算法及实现它的程序的效率和开销,这是一种事前分析估算的方法。

2、算法分析专有名词

问题: 需要完成的任务,即一组输入会有想应的输出,可以看出从输入到输出的一个函数。
算法: 指解决问题的一种方法或一个过程。是对特定问题求解步骤的一种秒数,在计算机中体现为指令的有限序列,其中一条指令表示一个或多个操作。
算法的四个特性:

  • 正确性: 必须完成期望的功能,因此必须要有输入和输出,并且能够将输入正确地转换为输出。
  • 可行性: 算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)。
  • 确定性: 必须无二义性,算法的每一个步骤都必须有明确的定义。
  • 有限性: 步骤一定是有限的,并且执行完成的时间一定是有限的。

程序: 使用某种程序设计语言对一个算法的实现。
问题规模: 指的是输入量的数目。
基本操作: 一个基本操作必须具有这样的性质:完成该操作所需时间与操作数的具体取值无关。
语句频度: 语句的频度指的是该语句执行的次数。
算法的代价: 是算法的效率的度量

  • 一个算法如果能在所要求的资源限制内将问题解决好,就说这个算法是有效率的。
  • 分类:
    • 时间代价:需要的时间资源的量
    • 空间代价:需要的空间资源的量
  • 算法代价的度量: 运行时间和所占空间大小。 影响因素:
    • 算法或数据结构的差异
    • 程序的编译和运行环境,如计算机的总线等外部设备,还有机器代码的质量等。需要完成的任务
      增长率: 当输入的规模增长时,算法代价的增长速率。
      T(n): 常表示为算法的时间代价函数,n为输入的规模

3、渐进算法分析

渐进算法分析的任务是对设计出的每一个具体的算法,利用数学工具,讨论它的复杂度,探讨具体算法对问题的适应性。探讨当问题输入规模很大或者达到极限的时候,算法代价的变化,是一种事前分析的方法。

大O表示法: 算法运行时间的上限。 对于非负函数T(n),若存在两个正常数c和n0,使得当n>n0时有T(n)≤cf(n),则称T(n)在集合O(f(n))中,记为T(n)∈O(f(n))。常数n0称为使得上限成立的n的最小值,一般情况下n0取值都很小。通常我们会选择一找到一个最"紧"的上限,因为这样的上限是最贴近算法代价的增长率的。

大Ω表示法:

  • 类似于大O表示法的定义
    算法运行时间的下限。对于非负函数T(n),若存在两个正常数c和n0,使得当n>n0时有T(n)≥cg(n),则称T(n))在集合Ω(g(n))中,记为T(n)∈Ω(g(n))。同样,通常我们会选择一找到一个最"紧"的下限,因为这样的下限是最贴近算法代价的增长率的。

  • 更严谨的一种定义:
    如果存在正常数c,对无穷多个n使得T(n) ≥ cg(n)成立,则称T(n))在集合Ω(g(n))中,这种定义方式更加严谨,对于一些分段函数,有一部分是无法找到相应的常数的,这是我们需要取复杂度大的那个,用此定义就可以直接找出。

Θ表示法: 当上、下限相等时,我们就可以用Θ表示法。即如果非负函数T(n)既在O(h(n))中,又在Ω(h(n))中,则称T(n)是Θ(h(n))。这是也说T(n)与h(n)同阶。

对于一些算法,在相同问题的输入规模下,并不是所有的输入情况的时间复杂度都是相同的,他们往往有以下几种情况:
最佳情况时间复杂度: 在给定规模时,某个算法在最好的输入情况下算法的时间复杂度。
最差情况时间复杂度: 在给定规模时,某个算法在最差的输入情况下算法的时间复杂度。
平均情况时间复杂度: 在给定规模时,算法的"典型"时间代价,即考虑它对于所有可能的输入数据集的代价期望值。(一般为等概率平均,问题遍历每一个数据的概率相同)

a)、时间复杂度化简规则

  1. 传递性。
    若f(n)∈O(g(n))中,且g(n)在O(h(n))中,则f(n)在O(h(n))中。
  2. 常数系数可忽略。
    若f(n)在O(kg(n))中对于任意常数k>0成立,则f(n)在O(h(n))中; 因为常数系数不会影响时间代价函数的增长率。
  3. 低阶可忽略
    若f1(n) 在O(g1(n))中,f2(n)在O(g2(n))中,则f1(n) +f2(n) 在O( max (g1(n),g2(n) ) ) 中 。
  4. 函数相乘则复杂度相乘
    若若f1(n) 在O(g1(n))中,f2(n)在O(g2(n))中,则f1(n) *f2(n) 在O( g1(n)*g2(n)) 中 。

b)、如何得到算法的增长率

方法: 定义估算归纳法

  • 分析问题或算法时,可以求出代价和输入规模的函数T(n),再通过化简规则进行化简即可。如果不能得到T(n)的准确算术表达式,可以用估算和猜测法得到表达式。
  • 利用增长率的上限和下限的定义,采用归纳法,推导出函数的上限和下限。从而得到求解问题的方法或算法增长率的上限和下限。

c)、两个函数的增长率比较

如果已知两个函数的增长率的算数表达式,判断哪个增长率更快的方式: 判断两个函数比值的极限lim f(n)/g(n) n-> 无穷

  • 如果极限值趋向于无穷,则f(n)在Ω(g(n))中,因为f(n)增长得更快。
  • 如果极限值趋向于0,则f(n)在O(g(n))中,因为g(n)增长得更快。
  • 如果极限值趋向于非0常数,则f(n)等于θ(g(n)),因为f(n)和g(n)增长率相同。

4、渐进算法分析的局限性

  • 当数据规模较小时,对估算结果有偏差
  • 增长率相同,无法区分系数不同的情况
  • 对困难问题进行数学建模难得出分析结果

5、算法分析扩展

a)、问题的代价分析

  • 问题代价的上限:已知最优解算法的代价上限
  • 问题代价的下限:所有可能算法的代价下限(包括尚未涉及出来的算法)

b)、空间代价

  • 与分析时间代价类似
  • 渐进分析中增大率的概念对于空间代价同样适用
  • 时间代价是相对于处理某个数据结构算法而言的
  • 空间代价是相对于该数据结构本身而言的

空间开销: 算法需要的磁盘或内存空间的大小
空间浪费: 是一个数据结构中预先分配的空间减去当前时机存储的数据,标识空间的利用率
结构性开销: 是数据结构实现时,为了便于有效地访问而附加的一些信息,这些并非真正数据的附加信息称为结构性开销。使用一些数据结构的结构性开销可以提高对数据结构访问的简单性与有效性,但同时要保证结构性开销尽可能的小。

c)、空间时间权衡原则

  • 以空间换时间:信息压缩存储
  • 以空间换时间:查找表

d)、基于磁盘的空间/时间权衡规则

在磁盘上的存储代价越小,程序运行得越快。这是因为从磁盘上读取数据的时间代价远远大于用于计算的时间代价,于是几乎所有用于对数据进行解压缩的额外操作的时间代价,都小于减少存储代价后节约下来的读盘时间。

你可能感兴趣的:(数据结构与算法分析)