1 / 34

Chapter 1 演算法分析

Chapter 1 演算法分析. 1.1 演算法 1.2 Big-O. 演算法分析 演算法是解決一問題的有限步驟,而評斷演算法的優劣可利用 Big-O 分析之,如 O(n) 比 O(n 2 ) 來得佳。. 1.1 演算法. 演算法( Algorithms )是一解決問題( problems )的有限步驟程序。 舉例來說,現有一問題為:判斷數字 x 是否在一已排序好的數字串列 s 中,其演算法為: 從 s 串列的第一個元素開始,依序的比較,直到 x 被發現或 s 串列已達盡頭。假使 x 被找到,則印出 Yes ;否則,印出 No 。. 1.1 演算法.

emilie
Download Presentation

Chapter 1 演算法分析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 1 演算法分析 1.1 演算法 1.2 Big-O

  2. 演算法分析 • 演算法是解決一問題的有限步驟,而評斷演算法的優劣可利用Big-O分析之,如O(n)比O(n2)來得佳。

  3. 1.1 演算法 • 演算法(Algorithms)是一解決問題(problems)的有限步驟程序。 • 舉例來說,現有一問題為:判斷數字x是否在一已排序好的數字串列s中,其演算法為:從s串列的第一個元素開始,依序的比較,直到x被發現或s串列已達盡頭。假使x被找到,則印出Yes;否則,印出No。

  4. 1.1 演算法 • 當問題很複雜時,上述敘述性的演算法就難以表達出來。因此,演算法大都以類似的程式語言表達之,繼而利用您所熟悉的程式語言執行之。

  5. 1.1 演算法 • “他的程式寫得比我好嗎?” • 應該利用客觀的方法進行比較,而此客觀的方法就是複雜度分析(complexity analysis)。 • 首先必須求出程式中每一敘述的執行次數(其中{和}不加以計算),將這些執行次數加總起來。然後求出其Big-O。

  6. 1.1 演算法 • 陣列元素相加(Add array members)

  7. 1.1 演算法 • 矩陣相乘(Matrix Multiplication)

  8. 1.1 演算法

  9. 1.1 演算法 • 循序搜尋(Sequential search)

  10. 1.1 演算法 • 二元搜尋(Binary search)

  11. 1.1 演算法 • 費氏數列(遞迴的片段程式)

  12. 1.1 演算法 • 費氏數列(非遞迴的片段程式)

  13. 1.2 Big-O • 如何去計算演算法所需要的執行時間呢?在程式或演算法中,每一敘述(statement)的執行時間為: • 此敘述執行的次數, • 每一次執行所需的時間,兩者相乘即為此敘述的執行時間。 • 由於每一敘述所須的時間必需實際考慮到機器和編譯器的功能,因此通常只考慮執行的次數而已。

  14. 1.2 Big-O • 下列有三個片段程式,請計算x=x+1的執行次數:

  15. 1.2 Big-O • 在分析演算法時,一般稱敘述的執行次數為order of magnitude,所以上述的(a) 、(b) 、(c)中,x=x+1的order of magnitude分別為1,n,n2。 • 而整個演算法的order of magnitude為演算法中每一敘述的執行次數之和。

  16. 1.2 Big-O • 算完程式敘述的執行次數後,通常利用Big-O來表示此演算法執行的時間。

  17. 1.2 Big-O • 請看下列範例: • 3n+2=O(n),∵我們可找到c=4,n0=2,使得3n+2<4n • 10n2+5n+1=O(n2),∵我們可以找到c=11,n0=6,使得10n2+5n+1<11n2 • 7*2n +n2+n=O(2n),∵我們可以找到c=8,n0=4,使得7*2n+n2+n<8*2n • 10n2+5n+1=O(n3),原來10n2+5n+1 O(n2),而n3又大於n2,理所當然10n2+5n+1=O(n3)是沒問題的。

  18. 1.2 Big-O • 其實,我們可以加以證明,當 f(n)=amnm +...+a1n+a0時,f(n)=O(nm)

  19. 1.2 Big-O • 循序搜尋(sequential search)的情形可分,其平均搜尋到的次數為

  20. 1.2 Big-O • 二元搜尋法乃是資料已經皆排序好,因此由中間(mid)開始比較,便可知欲搜尋的資料(key)落在mid的左邊還是右邊,再將左邊的中間拿出來與key相比,只是每次要調整每個段落的起始位址或最終位址。

  21. 1.2 Big-O

  22. 1.2 Big-O • 搜尋的次數為log32+1=6,此處的log表示log2。資料量為128個時,其搜尋的次數為log128+1,因此當資料量為n時,其執行的次數為logn+1。

  23. 1.2 Big-O • 讀者大略可知二元搜尋比循序搜尋好得太多了,其執行敘率為O(logn) 。 • 費氏數列(Fibonacci number),其定義如下:

  24. 1.2 Big-O

  25. 1.2 Big-O

  26. 1.2 Big-O

  27. 1.2 Big-O • 當n=3(f3)從上圖可知需計算的項目為5;n=5時,需計算的項目數為15個。因此我們可以下列公式表示:

  28. 1.2 Big-O

  29. 1.2 Big-O • 上述費氏數列是以遞迴的方式算出,其Big-O為O(2n/2),若改以非遞迴方式計算的話,其f(n)執行的項目為n+1項。 • 從上表得知,計算費氏數列若採用遞迴方法並不太適合,所以並不是所有的問題皆適合利用遞迴法,有關遞迴的詳細情形,請參閱第五章。

  30. 1.2 Big-O • Big-O的圖形表示如下:

  31. 1.2 Big-O • 例如有一程式的執行次數為n2+10n,則其Big-O為n2,表示此程式執行的時間最壞的情況下不會超過n2,因為 n2+10n≦2n2,當c=2,n≧10時

  32. 1.2 Big-O • 一般常見的Big-O有下列幾種情形: • O(1) 稱為常數時間(constant) • O(log n) 稱為次線性時間(sub-linear) • O(n) 稱為線性時間(linear) • O(n log n) 稱為n logn n • O(n2) 稱為平方時間(quadratic) • (n3) 稱為立方時間(cubic) • O(2n) 稱為指數時間(exponential) • O(n!) 稱為階層時間

  33. 1.2 Big-O • O(1)<O(log n) <O(n)<O(n log n) <O(n2)<O(n3)<O(2n)<O(3n)<O(n!),可由圖1-1或圖1-2得知。

  34. 1.2 Big-O

More Related