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