2 minute read

Quiz 1Permalink

Sort the following terms from slowest growing to fastest growing.

(log2n+1)372nn12nlog3727n1000(log2n)32log2nnlogn5log3n

这题其实非常 tricky。

首先要注意两点:

  • 2log2n=n
  • 5log3n=nlog35

所有我们上来可以排列成 3 组:

  • (log2n+1)3<1000(log2n)3
  • n12<2log2n<nlogn
  • 5log3n<nlog37<72n<27n

我们事后诸葛亮一下:这个问题可以转化为证明下面两个不等式:

  • 1000(log2n)3<n12
  • nlogn<5log3n

1. 不等式一Permalink

f(n)=1000(log2n)3n12。令 n=22k,于是得到:f(n)=8000k32k

这个很明显 limk+8000k32k=

所以:(log2n)3<n12

2. 不等式二Permalink

f(n)=nlogn5log3n=nlognnlog35。令 n=2k,于是得到:f(n)=2kk2k×log35=2k(k2(log351)×k)

因为 log351>0,所以 limk+k2(log351)×k=

所以:nlogn<5log3n

3. 综上Permalink

(log2n+1)3<1000(log2n)3<n12<2log2n<nlogn<5log3n<nlog37<72n<27n

Quiz 2Permalink

求以下两段代码各自的 computational cost:

(1) while (n > 2)
	n = sqrt(n); 
(2) while (n > 2) 
	n = log(n)

解:(1) 假设 while 运行 i 次时 n 的值为 n(i),有:

  • n(1)=n12
  • n(2)=n14
  • ……
  • n(i)=n12i

假设 n(k)=p2while 结束,有:

  • p=n12k,两边同时 2k 次方,得:
  • p(2k)=n,两边同时取对数,得:
  • (2k)×logp=logn,两边再次取对数,得:
  • log2k+loglogp=loglogn,即:
  • k×log2+loglogp=loglogn

loglogplog2 都是常数,kO(loglogn) ,即算法复杂度为 O(loglogn)

解:(2) 这题需要一个引入概念,叫 iterated logarithm:

logn:={0if n1;1+log(logn)if n>1

根据这个定义:log22=1,log222=2,log2222=3,

假设 while 运行 i 次时 n 的值为 n(i),有

  • n(1)=logn
  • n(2)=loglogn
  • ……
  • n(i)=logloglogn (ilog)

假设 n(k)=p2while 结束,根据 iterated logarithm,有:

log(n)=1+log(logn)=2+log(loglogn)=3+log(logloglogn)==k+log(logloglogn)=k+log(p)

log(p) 为常数,kO(logn) ,即算法复杂度为 O(logn)

Quiz 3Permalink

如何判断一个正整数是不是 2 的 n 次方?


解:设 x=2nxm bits,则 x 的最高位为 1,后 m1 位为 0

同时 x1 的最高位为 0,后 m1 位为 1,所以做 AND 运算有 x & (x - 1) == 0

Categories:

Updated:

Comments