数据结构与算法1.5_MOOC笔记

1.4算法复杂性分析

  • 算法渐进分析:大O表示法

    定义算法的复杂性为f,定义一个函数g,当算法问题规模n大于等于n0之后,存在一个正数c使得f(n)<=cg(n)

    称f(n)在集合O(g(n))中,简称f(n)=O(g(n))

    大O表示法:表达函数增长率上界(算法再复杂,也不会超过g(n)的量级)

    • 一个函数增长率的上限可能不止一个,一般期望找到最小上界
  • 算法渐进分析:大Ω表示法

    定义算法的复杂性为f,定义一个函数g,当算法问题规模n大于等于n0之后,存在一个正数c使得f(n)>=cg(n)

    称f(n)在集合Ω(g(n))中,简称f(n)=Ω(g(n))

    大Ω表示法:表达函数增长率下界

    • 一个函数增长率的下限可能不止一个,一般期望找到最大下界

注意:上下界情况的讨论是在n足够大时,可以忽略n较小时的特例,且不关心系数c的具体取值

​ 算法度量中,关心f(n)里的最高阶项,低阶多项式可以忽略

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

    若上限和下限相等,则可用θ表示法

    定义:

    ​ 如果一个函数既在集合O(g(n))中又在集合Ω(g(n))中,则称其为θ(g(n))

多数情况大θ和大O的表示一样

大O表示法的单位时间:

  • 简单布尔或算术运算 O(1)
  • 简单I/O:

    函数的输入输出 eg:从数组读数据等操作,参数传递

    不包含键盘文件等外设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 结构

  • 顺序找K值

    最佳情况:数组中第1个元素就是K(只要检索一个元素)

    复杂度O(1)

    最差情况:K数组的最后元素(检索了n个元素)

    等概分布时:K出现概率为1/n

    ​ 平均代价:(1+2+3+…+n)/n

    概率不等时:第一个元素出现概率为1/2,第二个为1/4,则第n个出现概率为(1-1/2-1/4)/(n-2)=1/4(n-2)

    ​ 平均代价:1/2+2/4+(3+4+…+n)/4(n-2)=1+(n+3)/5

    由上可知,概率相等于不等时,该算法平均代价为O(n)

  • 二分检索性能分析

    最佳情况:O(1)

    最差情况:最大长度为log2(n+1)

    检索数需下降至logn量级,平均检索代价为O(logn)

  • 时间/空间权衡(空间复杂表示也可使用O,Ω和θ表示)

    增大空间开销可能改善时间开销

    可以节省空间,但往往需要增大运算时间

    很多时候,数据结构的设计优先于算法,但很多问题一眼就能看出所需算法

猜你喜欢

转载自www.cnblogs.com/stanoswald/p/11986895.html