Professional Documents
Culture Documents
Algorithum
Algorithum
Algorithum
การวิเคราะห ์ความเร็วของโค ้ด
่
Algorithm คือ คาสังและขั ้
นตอนต่ ่ ้
างๆทีไว
่
ทาเพือแก ้ปัญหา
P
Tree (Binary 2
Search Tree)
1 4
3 5
11/17/2019 อ. ดร. วิษณุ โคตรจร ัส 3
กำรเลือกเก็บข้อมู ล
(ต่อ)
5 ถ ้าต ้องการข ้อมูลที่
Heap
เราสามารถจะเห็นได ้ทันทีวา
่ 339N0 <=
1*(N0*N0) T ( N 0) c( f ( N 0))
T ( N ) ( f ( N )) ( N )
2
11/17/2019
่ ้วย
ี าตอบอืนด
แต่มค
อ. ดร. วิษณุ โคตรจร ัส
-> T(N) <=
6
ตัวอย่ำงกำรคำนวณ BIG O (ต่อ)
ดังนั้น T(N)=O(N) ก็ถก ู เหมือนกัน แล ้วจะตอบ
อะไรกันแน่
ให ้ตอบเป็ นค่าทีน้ ่ ด เพราะค่าทีน้
่ อยทีสุ ่ อยทีสุ
่ ด
่
คือค่าทีเราเอามาใช ้จริงๆในการคิดความเร็วของ
โปรแกรม ฉะนั้น O(N) เป็ นคาตอบ
่
แล ้ว O(N) มันเกียวอะไรกั บการหาความเร็วใน
การ execute ของ code ขอให ้เราดูตวั อย่าง
ต่อไป
11/17/2019 อ. ดร. วิษณุ โคตรจร ัส 7
หำควำมเร็วของโค้ดต่อไปนี ้
แบบละเอียด
sigmaOfSquare(int n) // calculate
{ 1 unit (declare only)
1: int tempSum; 1 unit (assignment)
2: tempSum = 0; n+1 unit
n unit
3: for (int i=1;i<n;i++)
1 unit คูณ บวก และ
4: tempSum += i*i;
assignment อย่างละ
5: return tempSum; n จึง = 3n unit
} 1 unit (return)
รวมได ้ 5n+5 unit
11/17/2019 อ. ดร. วิษณุ โคตรจร ัส 8
หำควำมเร็วแบบละเอียดไม่ไหว
หรอก
แต่วา่ โปรแกรมแค่นียั ้ งเสียเวลาในการกะ running
time ขนาดนี ้ ดังนั้น โปรแกรมใหญ่ ๆ ยิงไม่ ่ ต ้องพูด
ถึง ดังนั้น ถ ้าจะคานวณ running time ของ
โปรแกรมให ้รวดเร็วเราจาเป็ นต ้องใช ้การประมาณ
อย่างคร่าว ๆ กว่านี ้ นั่นคือต ้องใช ้ Big O นั่นเอง
จากหน้าทีแล ่ ้ว เรากะได ้จาก loop เวลาในการ
่
run ส่วนอืนจะน้ อยมากเมือเที ่ ยบกับส่วนทีเป็
่ น
loop ซึงท ่ าซาไปเป็
้ น ผลคูณของ n ครง้ั
ฉะนั้น เมือคิ่ ดจากตัว loop โปรแกรมนี ้ จะมีBig O
11/17/2019 = O(n) อ. ดร. วิษณุ โคตรจร ัส 9
กำรหำ BIG O จำก loop ต่ำงๆ
้ั ่ loop
For loop ค่า Big O คือ จานวนครงที
ทาซา้
Nested loop
n รอบ
n รอบ
1: for (i = 1; i <= n; i++)
2: for (j = 1; j <= n; j++)
statements; Big O จะเป็ น
11/17/2019
O(n2)
อ. ดร. วิษณุ โคตรจร ัส 10
กำรหำ BIG O จำก loop ต่ำงๆ
(ต่อ)
นิ ยามของการคิด Nested loop เป็ นดังนี ้
ถ ้า T1(N)=O(f(N)) และ T2(N)= O(g(N))
แล ้วละก็
T1(N)* T2(N)= O(f(N)*g(N))
เอาตัวมากสุดมาตอบ นั่น
คือ O(n2)
11/17/2019 อ. ดร. วิษณุ โคตรจร ัส 12
กำรหำ BIG O จำก loop ต่ำงๆ (ต่อ
3)
นิ ยามของการหา running time จาก
Statement ทีเรี ่ ยงต่อกัน
ถ ้า T1(N)=O(f(N)) และ T2(N)= O(g(N))
แล ้วละก็
T1(N)+ T2(N)= max(O(f(N),O(g(N)))
เอาตัวมากสุดมาตอบ นั่น
คือ max(O(f(n),O(g(n)))
11/17/2019 อ. ดร. วิษณุ โคตรจร ัส 14
กำรหำ BIG O จำก recursion
1:mymethod (int n) {
2: if (n == 1) {
3: return 1;
4: } else {
5: return 2*mymethod(n – 1) + 1;
6: }
7:}
้ั big O = O(n)
n ครง,
ทีสุ่ ด)
ติดกัน
ตัวอย่างเช่น -2, 11, -6, 16, -5, 7
โปรแกรม
แต่แค่นียั้ งไม่ดพี อ เพราะมีการคานวณ
่ าซ
ทีซ ้ ้อนมากเกินไป
ถ ้าบวกจากตาแหน่ ง 0 ถึง2 ไปแล ้ว ตอนที่
บวกจากตาแหน่ งที่ 0 ถึง 3 กลับต ้องเริมบวก
่
่
ใหม่หมด แทนทีจะใช ้ผลจากการบวกจาก
ตาแหน่ ง 0 ถึง2 ได ้
11/17/2019 อ. ดร. วิษณุ โคตรจร ัส 18
ี ำรแก้ max sub sum แบบที่ 2
วิธก
1: int maxSubSum02 (int [] a) {
2: int maxSum = 0; ตัวเริม่
3: for (int i = 0; i < a.length; i++) {
4: int theSum = 0;
5: for (int j = i; j < a.length; j++) {
6: บวก theSum += a[j];
7: จากตัว if (theSum > maxSum) {
8: ่
เริมและ maxSum = theSum;
9: สะสม }
10: }
ค่า BIG O = O(n2)
่
11: }
12: เรือยๆ return maxSum;
13: }
่ i=0, j=1:
เมือ theSum = -2 + 11 = 9
maxSum กลายเป็ น 9
่ i=0, j=2:
เมือ theSum = 9 + (-6) = 3
maxSum ยังคงเป็ น 9
่ i=0, j=3:
เมือ
11/17/2019 theSum = ัส 3 + 4
อ. ดร. วิษณุ โคตรจร 20
ี ำรแก้ max sub sum แบบที่ 3
วิธก
ใช ้ divide and conquer
คาตอบอาจจะอยูใ ่น
ครึงซ ่ ้ายของการแบ่งปัญหา หรือ
่
ครึงขวาของการแบ่ งปัญหา หรือ
อยูท ้ั
่ งสองข ้าง (ต ้องมีตวั สุดท ้ายจาก
่ ้ายและตัวแรกจากครึงขวา)
ครึงซ ่
้ อ
Max sub sum ข ้างนี คื ้ อ 10
Max sub sum ข ้างนี คื
7
่ ้ายทีมี
ของครึงซ ่ ตวั สุดท ้าย (-6) คืของครึ ่
อ 1 งขวาที
มี่ ตวั แรก (2) คือ
10
่ ่
ยวข
Max sub sum ทีคาบเกี ้างซ ้ายและขวา คือ 1 +10 = 11 นี่
คือคาตอบ
ดังนั้น เวลารวมทังหมดจะเป็
้ น
T(n) = 2T(n/2) + 2O(n/2)