• 王道数据结构复习(一)


      本次数据结构复习重点复习了第一章绪论中关于时间复杂度的计算。一下简要介绍一下复习结果:

        一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。算法中的基本运算(最深层循环内的语句)的频度与T(n)同数量级,因此通常采用算法中基本运算的频度ƒ(n)来分析算法的时间复杂度。因此,算法的时间复杂度记为:

                    T(n)=Ο(ƒ(n))

      式中,Ο的含义时T(n)的数量级,其严格的数学定义是:若T(n)和ƒ(n)是定义在正整数集合上的两个函数,则存在正常数C和n使得当n≥n0时,都满足0≤T(n)≤Cƒ(n)。

      在分析一个程序的时间复杂性时,有一下两条规则:

      a)加法规则: T(n)=T1(n)+T2(n)=Ο(ƒ(n))+O(g(n)) = O(max(ƒ(n),g(n))

      b)乘法规则:T(n)=T1(n)*T2(n)=O(ƒ(n))+O(g(n))=O(ƒ(n)*g(n))

      常见的渐进时间复杂度为:

      O(1)<O(log2n)<O(n)<O(nlog2n)<P(n2)<O(n3)<O(2n)<O(n!)<O(nn)

      以下是一些题目回顾:

      1.求下述代码的时间复杂度

    void fun (int n) {
        int i = 1;
        while (i <= n)
            i = i * 2;
    }

      基本运算是

    i = i * 2

      设其执行次数为t,则2t≤n,即t≤log2n,因此复杂度T(n)=O(log2n)。

      2.下列函数的时间复杂度为:

    int func (int n) {
        int i = 0, sum = 0;
        while (sum < n) sum += ++i;
        return i;
    }

      

    sum += ++i;

      相当于

    ++i;
    sum = sum + i;

      进行到k次循环时,sum = (1+k)*k/2。需要O(n1/2)复杂度。

      3.一个算法所需时间由下述递归方程表示,试求出该算法时间复杂度级别:

      T(n)=1 当n=1;

      T(n)=2T(n/2)+n 当n>1;

      式中,n是问题规模,为简单起见,设n是2的整数次幂。

      此题目可以使用主定理解决。当T(n)=aT(n/b)+ƒ(n)时:1)ƒ(n)=O(nlogab-ε)  ε>0  T(n)=θ(nlogba)    2) ƒ(n)=θ(nlogba) 那么 T(n)=θ(nlogbalog2n)     3)ƒ(n)=Ω(nlogba+ε)且对C≤1有充分大的n有aƒ(n/b)≤Cƒ(n)  T(n)=θ(ƒ(n))。

      满足主定理2),因此复杂度O(nlog2n).

  • 相关阅读:
    rMATs分析single-end 数据,结果文件为空?
    Error in inherits(x, "theme") : argument "e2" is missing, with no default
    R 变量名开头不能为数字
    linux 下的通配符和正则表达式不一样
    samtools的一些问题
    Error in C(1, 2) : object not interpretable as a factor
    grep -w 正确使用,结果却不正确的原因之一
    慎用rm命令和*
    定义默认字典值为列表类型
    C语言考题:Find the key in the picture,good luck..
  • 原文地址:https://www.cnblogs.com/ulyssesgao/p/10617547.html
Copyright © 2020-2023  润新知