算法的效率度量

1.4 算法复杂性分析

f(n) = n² + 100n + log10n(log10的n次方) + 1000

  • 数据规模n逐步增大时,f(n)的增长趋势
  • 当n增大到一定值以后,计算公式中影响最大的就是n的幂次最高的项
    • 其他的常数项和低幂次项都可以忽略

算法渐进分析:大O表式法

  • 函数f,g定义域为自然数,值域非负实数集
  • 定义:如果存在正数c和n0,使得对任意的n>=n0,都有f(n)<=cg(n),
  • 称f(n)在集合O(g(n))中,简称f(n)是O(g(n))的,或f(n) = O(g(n))
  • 大O表示法:表达函数增长率上限
    • 一个函数增长率的上限可能不止一个
  • 当上、下限相同时则可用Θ表示法

大O最常用,大Θ通常也可简单看做大O

大O表示法的单位时间

  • 简单布尔或算术运算
  • 简单I/O
    • 指函数的输入/输出 例如,从数组读数据等操作
    • 不包括键盘文件等I/O
  • 函数返回

大O表示法的运算规则

  • 加法规则:f1(n) + f2(n) = O(max(f1(n), f2(n)))
    • 顺序结构,if结构,switch结构
  • 乘法规则:f1(n) * f2(n) = O(f1(n) * f2(n))
    • for, while, do-while结构

      	for (i=0; j<n; i++)
      
      		for(j=i; j<n; j++)
      
      				k++;
      

算法渐进分析:大Ω表示法

  • 定义:如果存在正数c和n0,使得对所有的n>=n0,都有f(n) >= cg(n),则称f(n)在集合Ω(g(n))中,或简称f(n)是Ω(g(n))的,或f(n) = Ω(g(n))
  • 大O表示法和大Ω表示法的唯一区别在于不等式的方向而已
  • 采用大Ω表示法时,最好找出在函数增值率的所有下限中哪个最"紧"(即最大)的下限

算法渐进分析:大θ表示法

  • 当上下限相同时则可用θ表示法

  • 定义如下:

    • 如果一个函数即在集合O(g(n))中又在集合Ω(g(n))中,则称其为θ(g(n))
  • 也即,当上、下限相同时则可用大θ表示法

  • 存在正常数c1,c2,以及正整数n0,使得对于任意的正整数n > n0,有下列两不等式同时成立:

    c1 g(n) <= f(n) <= c2g(n)

问题空间 vs 时间开销

最坏(压力测试) 平均 最佳

顺序找k值

  • 顺序从一个规模为n的一维数组中找出一个给定的K值
  • 最佳情况
    • 数组中国第1个元素就是K
    • 只要检查一个元素
  • 最差情况
    • K是数组的最后一个元素
    • 检查数组中所有的n个元素

顺序找K值----平均情况

  • 如果等概率分布

    • K值出现在n个位置上概率都是1/n
  • 则平均代价为O(n)

    n + 1 / 2

  • 概率不等

    • 出现在第1个位置的概率为1/2
    • 第2个位置上的概率为1/4
    • 出现在其他位置的概率都是 1/4(n-2)
  • 平均代价为O(n)

1 + (n + 3) / 8

二分法找K值

对于已排序顺序线性表

  • 数组中间位置的元素值Kmid
    • 如果Kmid = K,那么检索工作就完成了
    • 当Kmid > K时,检索继续在前半部分进行
    • 相反地,若Kmid < K ,就可以忽略mid以前的那部分,检索继续在后半部分进行
  • 快速
    • Kmid = K 结束
    • Kmid != K 起码缩小了一半的检索范围

二分法检索性能分析

  • 最大检索长度为 log2(n+1)

  • 失败的检索长度是 log2(n + 1) 或 log2(n + 1)

  • 平均检索代价为O(logn)

    在算法复杂性分析中

  • logn是以2为底的对数

  • 以其他数值为底,算法量级不变

时间/空间权衡

  • 数据结构
    • 一定的空间来存储它的每一个数据项
    • 一定的时间来执行单个基本操作
  • 代价和效益
    • 空间和时间的限制
    • 软件工程

时空权衡

  • 增大空间开销可能改善算法的时间开销
  • 可以节省空间,往往需要增大运算时间

数据结构和算法的选择

  • 仔细分析所要解决的问题
    • 特别是求解问题所涉及的数据类型和数据间逻辑关系 ---- 问题抽象、数据抽象
    • 数据结构的初步设计往往先于算法设计
  • 注意数据结构的可扩展性
    • 考虑当输入数据的规模发生改变时,数据结构是否能够适应求解问题的演变和扩展

思考:数据结构和算法的选择

  • 问题求解的目标?
  • 数据结构与算法选择的过程?

思考:数据结构的三要素

以下哪几种结构是逻辑结构,而与存储和运算无关()

A 顺序表 B 散列表 C 线性表 D 单链表

下面术语()与数据的存储结构无关

A 顺序表 B 链表 C 队列 D 循环链表

posted @ 2022-03-13 17:34  寻月隐君  阅读(150)  评论(0编辑  收藏  举报