算法分析與複雜性理論

1. 函數漸進的界

1.1 大 OO 符號

  • 定義:

    ffgg 是定義域爲自然數集N上的函數。若存在正數 ccn0n_0 ,使得對於一切 n>n0n > n_00f(n)cg(n)0 \le f (n) \le cg(n) 成立,則稱 f(n)f (n) 的漸進上界是 g(n)g(n),記作:

    f(n)=O(g(n))f (n) = O(g(n))

    自然數:自然數是指用以計量事物的件數或表示事物次序的數。即用數碼0,1,2,3,4……所表示的數。自然數由0開始,一個接一個,組成一個無窮的集體。自然數有有序性,無限性。分爲偶數和奇數,合數和質數等。

  • 說明:

    • f(n)=O(g(n))f (n) = O(g(n))f(n)f (n) 的階不高於 g(n)g(n) 的階;
    • 可能存在多個正數 cc ,只要指出一個即可;
    • 對前面有限多個值可以不滿足不等式;
    • 常數函數可以寫作 O(1)O(1)
  • 栗子:
    f(n)=n2+nf (n) = n^2 + n,則:

    • f(n)=O(n2)f (n) = O(n^2),取 c=2,n0=1c = 2, n_0 = 1 即可;
    • f(n)=O(n3)f (n) = O(n^3),取 c=1,n0=2c = 1, n_0 = 2 即可;

1.2 大 Ω\Omega 符號

  • 定義:

    ffgg 是定義域爲自然數集N上的函數。若存在正數 ccn0n_0 ,使得對於一切 n>n0n > n_00cg(n)f(n)0 \le cg(n) \le f (n) 成立,則稱 f(n)f (n) 的漸進下界是 g(n)g(n),記作:

    f(n)=Ω(g(n))f (n) = \Omega(g(n))

  • 說明:

    • f(n)=Ω(g(n))f (n) = \Omega(g(n))f(n)f (n) 的階不低於 g(n)g(n) 的階;
    • 可能存在多個正數 cc ,只要指出一個即可;
    • 對前面有限多個值可以不滿足不等式;
  • 栗子:

    f(n)=n2+nf (n) = n^2 + n,則:

    • f(n)=Ω(n2)f (n) = \Omega(n^2),取 c=1,n0=1c = 1, n_0 = 1 即可;
    • f(n)=Ω(100n)f (n) = \Omega(100n),取 c=1100,n0=1c = \frac{1}{100}, n_0 = 1 即可;

1.3 小 oo 符號

  • 定義:

    ffgg 是定義域爲自然數集N上的函數。若對於任意正數 cc 都存在 n0n_0使得對於一切 n>n0n > n_00f(n)cg(n)0 \le f (n) \le cg(n) 成立,則記作:

    f(n)=o(g(n))f (n) = o(g(n))

  • 說明:

    • f(n)=o(g(n))f (n) = o(g(n))f(n)f (n) 的階低於 g(n)g(n) 的階;
    • 對不同的正數 ccn0n_0 不一樣,cc 越小 n0n_0 越大;
    • 對前面有限多個值可以不滿足不等式;
  • 栗子:

    f(n)=n2+nf (n) = n^2 + n,則:f(n)=o(n3)f (n) = o(n^3)

    證:

    • c1c \ge 1 時顯然成立,只要取 n0=2n_0 = 2n2+n<cn3n^2 + n < cn^3

    • 0<c<10 < c < 1 時,取 n0=2cn_0 = \left \lceil \frac{2}{c} \right \rceil 即可,因爲當 nn0n \ge n_0

      cncn0>2cn \ge cn_0 > 2

      n2+n<2n2<cn3n^2 + n < 2n^2 < cn^3

1.4 小 ω\omega 符號

  • 定義:

    ffgg 是定義域爲自然數集N上的函數。若對於任意正數 cc 都存在 n0n_0使得對於一切 n>n0n > n_0 有 $0 \le cg(n) \le f (n) $ 成立,則記作:

    f(n)=ω(g(n))f (n) = \omega(g(n))

  • 說明:

    • f(n)=o(g(n))f (n) = o(g(n))f(n)f (n) 的階高於 g(n)g(n) 的階;
    • 對不同的正數 ccn0n_0 不一樣,cc 越小 n0n_0 越大;
    • 對前面有限多個值可以不滿足不等式;

1.5 Θ\Theta 符號

  • 定義:

    f(n)=O(g(n))f (n) = O(g(n))f(n)=Ω(g(n))f (n) = \Omega(g(n)),則記作:

    f(n)=Θ(g(n))f (n) = \Theta(g(n))

  • 說明:

    • f(n)f (n) 的階與 g(n)g(n) 的階相同
    • 對前面有限多個值可以不滿足條件;
定義 說明
OO ffgg 是定義域爲自然數集N上的函數。若存在正數 ccn0n_0 ,使得對於一切 n>n0n > n_00f(n)cg(n)0 \le f (n) \le cg(n) 成立,則稱 f(n)f (n) 的漸進上界是 g(n)g(n),記作:f(n)=O(g(n))f (n) = O(g(n)) f(n)=O(g(n))f (n) = O(g(n))f(n)f (n) 的階不高於 g(n)g(n) 的階; 可能存在多個正數 cc ,只要指出一個即可; 對前面有限多個值可以不滿足不等式; 常數函數可以寫作 O(1)O(1)
Ω\Omega ffgg 是定義域爲自然數集N上的函數。若存在正數 ccn0n_0 ,使得對於一切 n>n0n > n_00cg(n)f(n)0 \le cg(n) \le f (n) 成立,則稱 f(n)f (n) 的漸進下界是 g(n)g(n),記作:f(n)=Ω(g(n))f (n) = \Omega(g(n)) f(n)=Ω(g(n))f (n) = \Omega(g(n))f(n)f (n) 的階不低於 g(n)g(n) 的階; 可能存在多個正數 cc ,只要指出一個即可; 對前面有限多個值可以不滿足不等式;
oo ffgg 是定義域爲自然數集N上的函數。若對於任意正數 cc 都存在 n0n_0使得對於一切 n>n0n > n_00f(n)cg(n)0 \le f (n) \le cg(n) 成立,則記作:f(n)=o(g(n))f (n) = o(g(n)) f(n)=o(g(n))f (n) = o(g(n))f(n)f (n) 的階低於 g(n)g(n) 的階; 對不同的正數 ccn0n_0 不一樣,cc 越小 n0n_0 越大; 對前面有限多個值可以不滿足不等式;
ω\omega ffgg 是定義域爲自然數集N上的函數。若對於任意正數 cc 都存在 n0n_0,**使得對於一切 n>n0n > n_0 有 $0 \le cg(n) \le f (n) ** 成立,則記作:f (n) = \omega(g(n))$ f(n)=o(g(n))f (n) = o(g(n))f(n)f (n) 的階高於 g(n)g(n) 的階; 對不同的正數 ccn0n_0 不一樣,cc 越小 n0n_0 越大; 對前面有限多個值可以不滿足不等式;
Θ\Theta f(n)=O(g(n))f (n) = O(g(n))f(n)=Ω(g(n))f (n) = \Omega(g(n)),則記作:f(n)=Θ(g(n))f (n) = \Theta(g(n)) f(n)f (n) 的階與 g(n)g(n) 的階相同 對前面有限多個值可以不滿足條件;

2. 函數漸進界的定理

2.1 定理1:Knowledge

  • 定理內容:

    ffgg 是定義域爲自然數集合的函數。

    • 如果 limnf(n)g(n)\lim_{n \to \infty}\frac{f (n)}{g(n)} 存在,並且等於某個常數 c>0c > 0 ,那麼:

      f(n)=Θ(g(n))f (n) = \Theta(g(n))

    • 如果 limnf(n)g(n)=0\lim_{n \to \infty}\frac{f (n)}{g(n)} = 0 ,那麼:

      f(n)=o(g(n))f (n) = o(g(n))

    • 如果 limnf(n)g(n)=+\lim_{n \to \infty}\frac{f (n)}{g(n)} = +\infty ,那麼:

      f(n)=ω(g(n))f (n) = \omega(g(n))

  • 栗子:

    f(n)=12n23nf (n) = \frac{1}{2}n^2 - 3n,證明 f(n)=Θ(n2)f (n) = \Theta(n^2)

    證:因爲

    limnf(n)n2=limn12n23nn2=12\lim_{n \to \infty}\frac{f (n)}{n^2} = \lim_{n \to \infty}\frac{\frac{1}{2}n^2 - 3n}{n^2} = \frac{1}{2}

    根據定理1,有 f(n)=Θ(n2)f (n) = \Theta(n^2)

  • 根據定理1,得到的一些重要的結論:

    • nd=o(rn),r>1,d>0n^d = o(r^n), r > 1, d > 0 => 多項式函數的階低於指數函數的階
    • lnn=o(nd),d>0\ln n = o(n^d), d > 0 => 對數函數的階低於冪函數的階

2.2 定理2:

  • 定理內容:

    f,g,hf, g, h 的定義域爲自然數集合:(函數階之間的關係具有可傳遞性

    • 如果 f=O(g)f = O(g),且 f=O(h)f = O(h),那麼 f=O(h)f = O(h)
    • 如果 f=Ω(g)f = \Omega(g),且 f=Ω(h)f = \Omega(h),那麼 f=Ω(h)f = \Omega(h)
    • 如果 f=Θ(g)f = \Theta(g),且 f=Θ(h)f = \Theta(h),那麼 f=Θ(h)f = \Theta(h)

2.3 定理3:

  • 定理內容:

    ffgg 是定義域爲自然數集合的函數,若對某個其它的函數 hh ,有 f=O(h)f = O(h)g=O(h)g = O(h),那麼:

    f+g=O(h)f + g = O(h)

    => 該性質可以推廣到有限個函數

  • 算法的時間複雜度是各步操作時間之和,在常數步的情況下取最高階的函數即可。

4. 基本函數

4.1 對數函數

  • 符號:
    • logn=log2n\log n = \log_2 n
    • logkn=(logn)k\log^k n = (\log n)^k
    • loglogn=log(logn)\log\log n = \log(\log n)
  • 性質:
    • log2n=Θ(logln)\log_2 n = \Theta(\log_l n)
    • logbn=o(nα),α>0log_b n = o(n^\alpha), \alpha > 0
    • $\alpha ^{\log_b n} = n^{\log_b \alpha} $

4.2 指數函數與階乘

  • 斯特林公式(Stirling):

    n!=2πn(ne)n(1+Θ(1n))n! = \sqrt{2\pi n}(\frac{n}{e})^n(1 + \Theta(\frac{1}{n}))

  • Stirling 公式得到的結論:

    • n!=o(nn)n! = o(n^n)
    • n!=ω(2n)n! = \omega(2^n)
    • log(n!)=Θ(nlogn)\log(n!) = \Theta(n\log n)
  • log(n!)=Θ(nlogn)\log(n!) = \Theta(n\log n) 證明: Knowledge

    • log(n!)=Ω(nlogn)\log(n!) = \Omega(n\log n) 的證明:

      image-20200623230918389.png

      log(n!)=k=1nlogk1nlogxdx=loge(nlnnn+1)=Ω(nlogn)\log(n!) = \sum_{k = 1}^n\log k \ge \int_1^n \log x dx = \log e(n\ln n - n + 1) = \Omega(n\log n)

    • log(n!)=O(nlogn)\log(n!) = O(n\log n) 的證明:

      image-20200623231215489.png

      log(n!)=k=1nlogk2n+1logxdx=loge(nlnnn+1)=O(nlogn)\log(n!) = \sum_{k = 1}^n\log k \le \int_{2}^{n + 1} \log x dx = \log e(n\ln n - n + 1) = O(n\log n)

4.3 取整函數

  • 定義:
    • x\left \lfloor x \right \rfloor :表示小於等於x的最大整數
    • x\left \lceil x \right \rceil :表示大於等於x的最大整數
  • 性質:
    • x1<xxx<x+1x - 1 < \left \lfloor x \right \rfloor \le x \le \left \lceil x \right \rceil < x + 1
    • x+n=x+n,x+n=x+n\left \lfloor x + n \right \rfloor = \left \lfloor x \right \rfloor + n, \left \lceil x + n \right \rceil = \left \lceil x \right \rceil + n
    • n2+n2=n\left \lceil \frac{n}{2} \right \rceil + \left \lfloor \frac{n}{2} \right \rfloor = n
    • nab=nab,nab=nab\left \lceil \frac{\left \lceil \frac{n}{a} \right \rceil}{b} \right \rceil = \left \lceil \frac{n}{ab} \right \rceil, \left \lfloor \frac{\left \lfloor \frac{n}{a} \right \rfloor}{b} \right \rfloor = \left \lfloor \frac{n}{ab} \right \rfloor

4.4 按照階排序 Knowledge

22n,n!,n2n,(32)n,(logn)logn=nloglogn2^{2^n}, n!, n2^n, (\frac{3}{2})^n, (\log n)^{\log n} = n^{\log\log n}

n3,log(n!)=Θ(nlogn),n=2lognn^3, \log{(n!)} = \Theta(n\log n), n = 2^{\log n}

log2n,logn,logn,loglogn\log^2n, \log n, \sqrt{\log n}, \log\log n

n1logn=1n^{\frac{1}{\log n}} = 1

5. 序列求和的方法

5.1 引例

(1).k=1n11k(k+1)=k=1n1(1k1k+1)=k=1n11kk=1n11k+1=k=1n11kk=2n1k=11n\begin{aligned}(1). \sum_{k = 1}^{n - 1}\frac{1}{k(k + 1)}&=\sum_{k = 1}^{n - 1}(\frac{1}{k} - \frac{1}{k + 1})\\ &=\sum_{k = 1}^{n - 1}\frac{1}{k} - \sum_{k = 1}^{n - 1}\frac{1}{k + 1}\\ &=\sum_{k = 1}^{n - 1}\frac{1}{k} - \sum_{k = 2}^{n}\frac{1}{k} \\ &= 1 - \frac{1}{n} \\ \end{aligned}

(2).t=1kt2t1=t=1kt(2t2t1)=t=1kt2tt=1kt2t1=t=1kt2tt=0k1(t+1)2t=t=1kt2tt=0k1t2tt=0k12t=k2t(2k1)=(k1)2k+1\begin{aligned}(2). \sum_{t = 1}^{k}t2^{t - 1}&=\sum_{t = 1}^{k}t(2^t - 2^{t - 1}) \\ &=\sum_{t = 1}^{k}t2^t - \sum_{t = 1}^{k}t2^{t - 1} \\ &=\sum_{t = 1}^{k}t2^t - \sum_{t = 0}^{k - 1}(t + 1)2^t \\ &=\sum_{t = 1}^{k}t2^t - \sum_{t = 0}^{k - 1}t2^t - \sum_{t = 0}^{k - 1}2^t \\ &=k2^t - (2^k - 1) = (k - 1)2^k + 1\\ \end{aligned}

5.2 二分檢索的平均時間複雜度 knowledge

image-20200624204630269.png

A(n)=logn+12A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}

5.3 估計和式上界的放大法 knowledge

  • 兩個放大公式:

    • k=1naknamax\sum_{k = 1}^n a_k \le na_{max}

    • 假設存在常數 r<1r < 1 ,使得對一切 k0k \ge 0ak+1akr\frac{a_{k + 1}}{a_k} \le r 成立,則有如下結論:

      k=0nk=0a0rk=a0k=0rk=a01r\sum_{k = 0}^n \le \sum_{k = 0}^\infty a_0r^k = a_0\sum_{k = 0}^\infty r^k = \frac{a_0}{1 - r}

  • 栗子:

    估計k=1nk3k\sum_{k = 1}^n \frac{k}{3^k} 的上界。

    解:

    k=1nk3k=k=0nk3k\sum_{k = 1}^n \frac{k}{3^k} = \sum_{k = 0}^{n}\frac{k}{3^{k}}

    ​ 令 ak=k3k,ak+1=k+13k+1a_k = \frac{k}{3^{k}}, a_{k + 1} = \frac{k + 1}{3^{k + 1}},則 ak+1ak=(k+1)3k(k)3k+1=k+13k23(k>=1)\frac{a_{k + 1}}{a_k} = \frac{(k + 1)3^{k}}{(k)3^{k + 1}} = \frac{k + 1}{3k} \le \frac{2}{3} (k >= 1)

    所以,由上述第二個放大公式有:

    k=1nk3kk=113(23)k1=131123=1\sum_{k = 1}^n \frac{k}{3^k} \le \sum_{k = 1}^\infty \frac{1}{3}(\frac{2}{3})^{k - 1} = \frac{1}{3}\frac{1}{1 - \frac{2}{3}} = 1

5.4 估計和式漸進的界 Knowledge

估計k=1n1k\sum_{k = 1}^n \frac{1}{k} 的漸進的界

  • k=1n1k1n+1dxx=ln(n+1)\sum_{k = 1}^n \frac{1}{k} \ge \int_1^{n + 1}\frac{dx}{x} = \ln (n + 1)

    image-20200624213050265.png

  • k=1n1k=11+k=2n1k1+1ndxx=lnn+1\sum_{k = 1}^n \frac{1}{k} = \frac{1}{1} + \sum_{k = 2}^n \frac{1}{k} \le 1 + \int_1^{n}\frac{dx}{x} = \ln n + 1

    image-20200624213228553.png

    所以,k=1n1k=Θ(lnn)=Θ(logn)\sum_{k = 1}^n \frac{1}{k} = \Theta(\ln n) = \Theta(\log n)

6. 遞推方程與算法分析 Knowledge

  • 主定理的應用背景:

    T(n)=aT(nb)+f(n)T(n) = aT(\frac{n}{b}) + f (n)

    • aa :規約後的子問題個數
    • $\frac{n}{b} $ :規約後子問題的規模
    • f(n)f (n) :規約過程以及組合子問題的解的工作量

    二分檢索 => T(n)=T(n2)+1T(n) = T(\frac{n}{2}) + 1

    二分歸併排序 => T(n)=2T(n2)+n1T(n) = 2T(\frac{n}{2}) + n - 1

  • 主定理:

    a>1,b>1a > 1, b > 1 爲常數,f(n)f (n) 爲函數,T(n)T(n) 爲非負整數,且 T(n)=aT(nb)+f(n)T(n) = aT(\frac{n}{b}) + f (n),則:

    1. f(n)=O(nlogbaϵ)f (n) = O(n^{log_b a - \epsilon})ϵ>0\epsilon > 0 ,那麼:

      T(n)=Θ(nlogba)T(n) = \Theta(n^{\log_b a})

    2. f(n)=Θ(nlogba)f (n) = \Theta(n^{log_b a}),那麼:

      T(n)=Θ(nlogbalogn)T(n) = \Theta(n^{\log_b a}\log n)

    3. f(n)=Ω(nlogba+ϵ)f (n) = \Omega(n^{\log_b a + \epsilon})ϵ>0\epsilon > 0,且對於某個常數 c<1c < 1 和充分大的 nnaf(nb)cf(n)af(\frac{n}{b}) \le cf (n),那麼:

      T(n)=Θ(f(n))T(n) = \Theta(f (n))

  • 例1:

    求解遞推方程:T(n)=9T(n3)+nT(n) = 9T(\frac{n}{3}) + n

    解:

    a=9,b=3,f(n)=na = 9, b = 3, f (n) = n

    nlogba=nlog39=n2n^{\log_b a} = n^{log_3 9} = n^2f(n)=O(nlog391)f (n) = O(n^{log_3 9 - 1})

    ​ 根據主定理規則1,其中 ϵ=1\epsilon = 1

    T(n)=Θ(n2)T(n) = \Theta(n^2)

  • 例2:

    求解遞推方程:T(n)=T(2n3)+1T(n) = T(\frac{2n}{3}) + 1

    解:

    a=1,b=32,f(n)=1a = 1, b = \frac{3}{2}, f (n) = 1

    nlogba=nlog321=1n^{log_b a} = n^{log_{\frac{3}{2}} 1} = 1f(n)=nlog321f (n) = n^{log_{\frac{3}{2}}1}

    ​ 根據主定理規則2:

    T(n)=Θ(nlog321logn)=Θ(logn)T(n) = \Theta(n^{\log_{\frac{3}{2}} 1} \log n) = \Theta(\log n)

  • 例3:

    求解遞推方程:T(n)=3T(n4)+nlognT(n) = 3T(\frac{n}{4}) + n\log n

    解:

    a=3,b=4,f(n)=nlogna = 3, b = 4, f (n) = n\log n

    nlogba=nlog430.793n^{\log_b a} = n^{\log_4 3} \approx 0.793

    ​ 取 ϵ=0.2\epsilon = 0.2,則 f(n)=nlogn=Ω(nlog43+0.2)f (n) = n\log n = \Omega(n^{\log_4 3 + 0.2}) = Ω(n0.993)\Omega(n^{0.993})

    ​ 條件驗證:要使 af(nb)cf(n)af(\frac{n}{b}) \le cf (n) 成立,帶入 f(n)=nlognf (n) = n\log n 得到:

    3(n4)log(n4)cnlogn3(\frac{n}{4})\log (\frac{n}{4}) \le cn\log n

    ​ 當 c34c \ge \frac{3}{4} 時,上述不等式可以對充分打的n成立,根據主定理規則3:

    T(n)=Θ(f(n))=Θ(nlogn)T(n) = \Theta(f (n)) = \Theta(n\log n)

  • 二分檢索:

    W(n)=W(n2)+1,W(1)=1W(n) = W(\frac{n}{2}) + 1, W(1) = 1

    解:

    a=1,b=2,f(n)=1,nlog21=1a = 1, b = 2, f (n) = 1, n^{\log_2 1} = 1

    ​ 根據主定理規則2:

    W(n)=Θ(logn)W(n) = \Theta(\log n)

  • 二分歸併排序:

    W(n)=2W(n2)+n1,W(1)=0W(n) = 2W(\frac{n}{2}) + n - 1, W(1) = 0

    解:
    a=2,b=2,f(n)=n1,nlog22=na = 2, b = 2, f (n) = n - 1, n^{\log_2 2} = n

    ​ 根據主定理規則2:

    W(n)=Θ(nlogn)W(n) = \Theta(n\log n)

  • 例4: => 不能使用主定理的情形

    求解遞推方程:T(n)=2T(n2)+nlognT(n) = 2T(\frac{n}{2}) + n\log n

    解:

    a=2,b=2,f(n)=nlogn,nlogba=na = 2, b = 2, f (n) = n\log n, n^{\log_b a} = n

    ​ 不存在 ϵ>0\epsilon > 0 使得:nlogn=Ω(n1+ϵ)n\log n = \Omega(n^{1 + \epsilon})

    ​ 不存在 c<1c < 1 使 af(nb)cf(n)af(\frac{n}{b}) \le cf (n) 對所有充分大的 nn 成立

    2(n2)logn2=n(logn1)cnlogn2(\frac{n}{2})\log{\frac{n}{2}} = n(\log n - 1) \le cn\log n

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章