王道数据结构复习(一)

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

    一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为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).

猜你喜欢

转载自www.cnblogs.com/ulyssesgao/p/10617547.html
今日推荐