• [Study] 算法时间复杂度计算方法复习


    之前想开坑坚持实践陈皓的ARTS挑战, 奈何发现自己的学习水平和输出水平做不到每周写一篇ARTS文章. 不过我很喜欢ARTS的写作方向: Algorithm(算法), Review(评论), Tip(实践技巧), Share/Study(分享/学习); 这四方面相辅相成, 能够通过写作很好的锻炼各项能力. 所以, 就拆分一下吧, 1次写不了4个, 那1次写1个还是可以的.

    定义

    算法的时间复杂度使用渐进记号((Theta), (O), (Omega), (o), (omega))来描述, 它们的定义如下:

    [渐进紧确界: Theta (g(n))={f(n): 存在常量c_1, c_2和n_0, 使得对所有n>=n_0, 有0<=c_1g(n)<=f(n)<=c_2g(n)} ]

    [渐进上界: O(g(n))={f(n): 存在常量c和n_0, 使得对所有n>=n_0, 有0<=cg(n)<=f(n)} ]

    [渐进下界: Omega (g(n))={f(n): 存在常量c和n_0, 使得对所有n>=n_0, 有0<=f(n)<=cg(n)} ]

    [非渐进紧确上界: o(g(n))={f(n): 对任意常量c>0, 存在常量n_0>0, 使得对所有n>=n_0, 有0<=f(n)<cg(n)} ]

    [非渐进紧确下界: omega(g(n))={f(n): 对任意常量c>0, 存在常量n_0>0, 使得对所有n>=n_0, 有0<=cg(n)<f(n)} ]

    这些渐进记号中平常常用的是前三种((Theta), (O), (Omega)), 因为日常使用中我们最关心最坏情况下时间复杂度, 所以渐进上界(O)也是最为常用的记号. 对于这三种记号, 结合算法导论上的配图很好理解.

    1. (O)描述了最坏情况下的时间复杂度量级;
    2. (Omega)描述了最好情况下的时间复杂度量级;
    3. (Theta)是由(O)(Omega)组成的一个区间;

    将渐进记号和实数之间的大小比较作类比, 也更好理解:

    [f(n) = O(n) 类似于 a <= b ]

    [f(n) = Omega (n) 类似于 a >= b ]

    [f(n) = Theta (n) 类似于 a = b ]

    [f(n) = o(n) 类似于 a < b ]

    [f(n) = omega (n) 类似于 a > b ]

    运算

    渐进函数具有传递性, 自反性, 对称性和转置对称性. 举例来说:

    [传递性: f(n) = O(g(n)) 且 g(n) = O(h(n)) /Rightarrow f(n)=O(h(n)) ]

    [自反性: f(n)=O(f(n)) ]

    [转置对称性: f(n) = O(g(n)) 当且仅当 g(n) = Omega (f(n)) ]

    利用这些性质可以通过推导的方式得出算法的时间复杂度.

    • 以快速排序为例
    # 提供一个最好理解的递归实现
    def quiksort(l):
        if len(l) < 2:
            return l
        anchor = l[0]
        left = [i for i in l[1:] if i < anchor] #注意l[1:]
        right = [i for i in l[1:] if i >= anchor]
        return quiksort(left) + [anchor] + quiksort(right)
    

    时间复杂度推导公式如下:

    [egin{equation} egin{split} T(n) &= O(n) + 2 * T(n/2) \ &= O(n) + 2 * O(n/2) + 4 * T(n/4) \ &= sum_{i=1}^{lg(n)} O(n) \ &= O(nlg(n)) end{split} end{equation} ]

  • 相关阅读:
    C#操作SQLite 报错 (Attempt to write a readonly database)
    JS判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
    JueryUI插件的简单应用(一):介绍及第一个示例
    在VS2008(Winform)中使用WebService
    Oracle触发器使用
    C# 创建Windows服务。服务功能:定时操作数据库
    aspnet前后台条件下根目录的读取
    xshell实现端口转发
    (转)使用FreeType实现矢量字体的粗体、斜体、描边、阴影效果
    D3D坐标系统和几何DirectX Griaphic学习
  • 原文地址:https://www.cnblogs.com/carlsplace/p/12951334.html
Copyright © 2020-2023  润新知