Efficient Algorithm      郭至軒(KuoE0)     KuoE0.tw@gmail.com          KuoE0.ch
Attribution-ShareAlike 3.0 Unported           (CC BY-SA 3.0)  http://creativecommons.org/licenses/by-sa/3.0/              ...
Time Complexity
最大連續和     有一長度為 n 的數列 A1, A2, A3, ...,          An-1, An,求其最大連續區間和。A1   A2   A3      ...         An-2   An-1   An         ...
int MAX = A[ 1 ];for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) {   int sum = 0;   for ( int k = i; k <= j;...
int MAX = A[ 1 ];for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) {   int sum = 0;   for ( int k = i; k <= j;...
int MAX = A[ 1 ];for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) {   int sum = 0;   for ( int k = i; k <= j;...
int MAX = A[ 1 ];   for ( int i = 1; i <= n; ++i )    for ( int j = i; j <= n; ++j ) {      int sum = 0;      for ( int k ...
n   n                        n(n + 1)(n + 2)T (n) = ∑ ∑ j − i + 1 =        i=1 j=i                6
n   n                        n(n + 1)(n + 2)T (n) = ∑ ∑ j − i + 1 =                   三次式        i=1 j=i                6
n   n                        n(n + 1)(n + 2)T (n) = ∑ ∑ j − i + 1 =                          三次式        i=1 j=i           ...
n^3   n^2        n   17000525035001750  0       3   7   11   13          17           19
最大指數次項影響最大 Time Complexity:   O(n3)
不需精確分析進行精確分析較耗時間!
不需精確分析進行精確分析較耗時間!  略估迴圈次數
int MAX = A[ 1 ];for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) {   int sum = 0;   for ( int k = i; k <= j;...
n×n×n=           n 3Time Complexity:   O(n3)
前處理優化
最大連續和     有一長度為 n 的數列 A1, A2, A3, ...,          An-1, An,求其最大連續區間和。A1   A2   A3      ...         An-2   An-1   An         ...
設數列 S 為數列 A 的累積和,因此 Si = A1 + A2 + ... + Ai,則Ai + Ai+1 + ... + Aj = Sj - Si-1。
設數列 S 為數列 A 的累積和,   因此 Si = A1 + A2 + ... + Ai,則    Ai + Ai+1 + ... + Aj = Sj - Si-1。求區間 [i,j] 的連續和        需要 O(1) 的時間。
A1   A2   A3   A4   A5   A6    A7   A8S1   3    7    -1   -3   9    -10   1    2    3S2   3    7    -1   -3   9    -10   1...
int MAX = A[ 1 ];S[ 0 ] = 0;for ( int i = 1; i <= n; ++i ) S[ i ] = S[ i - 1 ] + A[ i ];for ( int i = 1; i <= n; ++i ) for...
int MAX = A[ 1 ];S[ 0 ] = 0;for ( int i = 1; i <= n; ++i ) S[ i ] = S[ i - 1 ] + A[ i ];                                O(...
Divide & Conquer     分而治之
劃分為相同的子問題
劃分為相同的子問題 遞迴求解子問題
劃分為相同的子問題 遞迴求解子問題將子問題的解合併
最大連續和     有一長度為 n 的數列 A1, A2, A3, ...,          An-1, An,求其最大連續區間和。A1   A2   A3      ...         An-2   An-1   An         ...
切割問題A1   A2   A3    ...   An-2   An-1   An
切割問題     A1    A2        A3                          ...                       An-2      An-1   An     A1         A2      ...
求解問題遞迴直到數列   剩一元素,直接回傳該數值。  有一元素時,該數值為最大連續和。
合併子問題解選擇子問題中最優解!       ...   ...  10               11
合併子問題解選擇子問題中最優解!       ...   ...  10               11
But....A1   A2        A3                  ...                An-2     An-1   AnA1        A2        ...   An/2             ...
But....                    答案可能橫跨兩個區間!A1   A2        A3                  ...                An-2     An-1   AnA1        A2...
How-to5   -9   3    1   3   -10   3   3
How-to5    -9   3    1   3   -10   3   3    最大連續和:5
How-to5    -9   3    1    3   -10   3   3    最大連續和:5        最大連續和:6
How-to5    -9   3    1    3   -10   3   3    最大連續和:5        最大連續和:6          當前最大連續和:6
How-to5   -9   3    1   3   -10   1   1         當前最大連續和:6
How-to   5   -9   3    1   3   -10   1   1自右而左找最大連續和            當前最大連續和:6
How-to   5   -9   3    1   3   -10   1   1     連續和:4自右而左找最大連續和            當前最大連續和:6
How-to   5   -9   3    1   3   -10   1   1     連續和:4自右而左找最大連續和           自左而右找最大連續和            當前最大連續和:6
How-to   5   -9   3    1   3   -10   1   1     連續和:4自右而左找最大連續和           連續和:3                     自左而右找最大連續和            當...
How-to    5   -9    3   1   3   -10   1   1     連續和:4自右而左找最大連續和  連續和:3            自左而右找最大連續和         連續和:7             當前最...
How-to    5   -9    3   1   3   -10   1   1     連續和:4自右而左找最大連續和  連續和:3            自左而右找最大連續和         連續和:7             當前最...
int maxsum( int L, int R ) {  if ( R - L == 1 )   return A[ L ];  int mid = ( L + R ) / 2;  int MAX = max( maxsum( L, mid ...
Time Complexity              total time
Time Complexity              total time                   n              2 * (n/2) = n                   ...              ...
The height             }             log2n
Time Complexity: O(n×log2n)
Time Complexity of Divide & Conquer   子問題扣除遞迴呼叫的時間複雜度 C(n)                 遞迴呼叫層數 H(n)   Time Complexity: C(n) × H(n)
Time Comparison        n3      n2     nlog2n100     0.15    0.02    0.011000   123.86   1.36    0.14                      ...
從測試資料判斷演算法   假設機器 1 秒可以執行 106 個指令,...時間複雜度   n!   2n   n3     n2     nlog2n        n最大規模    9    20   10 2   10 3   7.5 × ...
另一種說法   假設機器 1 秒可以執行 108 個指令,...時間複雜度   n!    2n   n3    n2     nlog2n        n最大規模    11    26   464   10 4   4.5 × 10 6 ...
Practice Now10245 - The Closest Pair Problem
Reference• 提升程式設計的邏輯思考力 (link)
Thank You for Your    Listening.
Upcoming SlideShare
Loading in …5
×

[ACM-ICPC] Efficient Algorithm

735 views

Published on

Published in: Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
735
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
33
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

[ACM-ICPC] Efficient Algorithm

  1. 1. Efficient Algorithm 郭至軒(KuoE0) KuoE0.tw@gmail.com KuoE0.ch
  2. 2. Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) http://creativecommons.org/licenses/by-sa/3.0/ Latest update: Feb 27, 2013
  3. 3. Time Complexity
  4. 4. 最大連續和 有一長度為 n 的數列 A1, A2, A3, ..., An-1, An,求其最大連續區間和。A1 A2 A3 ... An-2 An-1 An } MAX
  5. 5. int MAX = A[ 1 ];for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) { int sum = 0; for ( int k = i; k <= j; ++k ) sum += A[ k ]; MAX = max( MAX, sum ); }
  6. 6. int MAX = A[ 1 ];for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) { int sum = 0; for ( int k = i; k <= j; ++k ) sum += A[ k ]; MAX = max( MAX, sum ); } 核心運算:加法
  7. 7. int MAX = A[ 1 ];for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) { int sum = 0; for ( int k = i; k <= j; ++k ) sum += A[ k ]; MAX = max( MAX, sum ); }
  8. 8. int MAX = A[ 1 ]; for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) { int sum = 0; for ( int k = i; k <= j; ++k ) sum += A[ k ]; MAX = max( MAX, sum ); } n n n(n + 1)(n + 2)加法次數: T (n) = ∑ ∑ j − i + 1 = i=1 j=i 6
  9. 9. n n n(n + 1)(n + 2)T (n) = ∑ ∑ j − i + 1 = i=1 j=i 6
  10. 10. n n n(n + 1)(n + 2)T (n) = ∑ ∑ j − i + 1 = 三次式 i=1 j=i 6
  11. 11. n n n(n + 1)(n + 2)T (n) = ∑ ∑ j − i + 1 = 三次式 i=1 j=i 6 n3 n2 n 1 n=10 10 3 10 2 10 1 1 n=10 2 10 6 10 4 10 2 1 n=10 3 10 9 10 6 10 3 1
  12. 12. n^3 n^2 n 17000525035001750 0 3 7 11 13 17 19
  13. 13. 最大指數次項影響最大 Time Complexity: O(n3)
  14. 14. 不需精確分析進行精確分析較耗時間!
  15. 15. 不需精確分析進行精確分析較耗時間! 略估迴圈次數
  16. 16. int MAX = A[ 1 ];for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) { int sum = 0; for ( int k = i; k <= j; ++k ) sum += A[ k ]; MAX = max( MAX, sum ); } 最多次數 第 1 層迴圈 n 第 2 層迴圈 n 第 3 層迴圈 n
  17. 17. n×n×n= n 3Time Complexity: O(n3)
  18. 18. 前處理優化
  19. 19. 最大連續和 有一長度為 n 的數列 A1, A2, A3, ..., An-1, An,求其最大連續區間和。A1 A2 A3 ... An-2 An-1 An } MAX
  20. 20. 設數列 S 為數列 A 的累積和,因此 Si = A1 + A2 + ... + Ai,則Ai + Ai+1 + ... + Aj = Sj - Si-1。
  21. 21. 設數列 S 為數列 A 的累積和, 因此 Si = A1 + A2 + ... + Ai,則 Ai + Ai+1 + ... + Aj = Sj - Si-1。求區間 [i,j] 的連續和 需要 O(1) 的時間。
  22. 22. A1 A2 A3 A4 A5 A6 A7 A8S1 3 7 -1 -3 9 -10 1 2 3S2 3 7 -1 -3 9 -10 1 2 10S3 3 7 -1 -3 9 -10 1 2 9S4 3 7 -1 -3 9 -10 1 2 6S5 3 7 -1 -3 9 -10 1 2 15S6 3 7 -1 -3 9 -10 1 2 5S7 3 7 -1 -3 9 -10 1 2 6S8 3 7 -1 -3 9 -10 1 2 8
  23. 23. int MAX = A[ 1 ];S[ 0 ] = 0;for ( int i = 1; i <= n; ++i ) S[ i ] = S[ i - 1 ] + A[ i ];for ( int i = 1; i <= n; ++i ) for ( int j = i; j <= n; ++j ) { MAX = max( MAX, S[ j ] - S[ i - 1 ] ); }
  24. 24. int MAX = A[ 1 ];S[ 0 ] = 0;for ( int i = 1; i <= n; ++i ) S[ i ] = S[ i - 1 ] + A[ i ]; O(n)for ( int i = 1; i <= n; ++i ) O(n2) for ( int j = i; j <= n; ++j ) { MAX = max( MAX, S[ j ] - S[ i - 1 ] ); } 最大指數次項:O(n2)
  25. 25. Divide & Conquer 分而治之
  26. 26. 劃分為相同的子問題
  27. 27. 劃分為相同的子問題 遞迴求解子問題
  28. 28. 劃分為相同的子問題 遞迴求解子問題將子問題的解合併
  29. 29. 最大連續和 有一長度為 n 的數列 A1, A2, A3, ..., An-1, An,求其最大連續區間和。A1 A2 A3 ... An-2 An-1 An } MAX
  30. 30. 切割問題A1 A2 A3 ... An-2 An-1 An
  31. 31. 切割問題 A1 A2 A3 ... An-2 An-1 An A1 A2 ... An/2 An/2+1 An/2+2 ... AnA1 ... An/4 An/4+1 ... An/2 An/2+1 ... A3n/4 A3n/4+1 ... AnA1 An/4 An/4+1 An/2 An/2+1 A3n/4 A3n/4+1 An
  32. 32. 求解問題遞迴直到數列 剩一元素,直接回傳該數值。 有一元素時,該數值為最大連續和。
  33. 33. 合併子問題解選擇子問題中最優解! ... ... 10 11
  34. 34. 合併子問題解選擇子問題中最優解! ... ... 10 11
  35. 35. But....A1 A2 A3 ... An-2 An-1 AnA1 A2 ... An/2 An/2+1 An/2+2 ... An
  36. 36. But.... 答案可能橫跨兩個區間!A1 A2 A3 ... An-2 An-1 AnA1 A2 ... An/2 An/2+1 An/2+2 ... An
  37. 37. How-to5 -9 3 1 3 -10 3 3
  38. 38. How-to5 -9 3 1 3 -10 3 3 最大連續和:5
  39. 39. How-to5 -9 3 1 3 -10 3 3 最大連續和:5 最大連續和:6
  40. 40. How-to5 -9 3 1 3 -10 3 3 最大連續和:5 最大連續和:6 當前最大連續和:6
  41. 41. How-to5 -9 3 1 3 -10 1 1 當前最大連續和:6
  42. 42. How-to 5 -9 3 1 3 -10 1 1自右而左找最大連續和 當前最大連續和:6
  43. 43. How-to 5 -9 3 1 3 -10 1 1 連續和:4自右而左找最大連續和 當前最大連續和:6
  44. 44. How-to 5 -9 3 1 3 -10 1 1 連續和:4自右而左找最大連續和 自左而右找最大連續和 當前最大連續和:6
  45. 45. How-to 5 -9 3 1 3 -10 1 1 連續和:4自右而左找最大連續和 連續和:3 自左而右找最大連續和 當前最大連續和:6
  46. 46. How-to 5 -9 3 1 3 -10 1 1 連續和:4自右而左找最大連續和 連續和:3 自左而右找最大連續和 連續和:7 當前最大連續和:6
  47. 47. How-to 5 -9 3 1 3 -10 1 1 連續和:4自右而左找最大連續和 連續和:3 自左而右找最大連續和 連續和:7 當前最大連續和:6 最終最大連續和:7
  48. 48. int maxsum( int L, int R ) { if ( R - L == 1 ) return A[ L ]; int mid = ( L + R ) / 2; int MAX = max( maxsum( L, mid ), maxsum( mid, R ) ); int tempL = 0, tempR = 0; for ( int i = mid - 1, sum = 0; i >= L; --i ) tempL = max( tempL, sum += A[ i ] ); for ( int i = mid, sum = 0; i < R; ++i ) tempR = max( tempR, sum += A[ i ] ); return max( MAX, tempL + tempR );}
  49. 49. Time Complexity total time
  50. 50. Time Complexity total time n 2 * (n/2) = n ... n * (n/n) = n
  51. 51. The height } log2n
  52. 52. Time Complexity: O(n×log2n)
  53. 53. Time Complexity of Divide & Conquer 子問題扣除遞迴呼叫的時間複雜度 C(n) 遞迴呼叫層數 H(n) Time Complexity: C(n) × H(n)
  54. 54. Time Comparison n3 n2 nlog2n100 0.15 0.02 0.011000 123.86 1.36 0.14 單位:秒
  55. 55. 從測試資料判斷演算法 假設機器 1 秒可以執行 106 個指令,...時間複雜度 n! 2n n3 n2 nlog2n n最大規模 9 20 10 2 10 3 7.5 × 10 4 10 6
  56. 56. 另一種說法 假設機器 1 秒可以執行 108 個指令,...時間複雜度 n! 2n n3 n2 nlog2n n最大規模 11 26 464 10 4 4.5 × 10 6 10 8
  57. 57. Practice Now10245 - The Closest Pair Problem
  58. 58. Reference• 提升程式設計的邏輯思考力 (link)
  59. 59. Thank You for Your Listening.

×