การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... ·...
TRANSCRIPT
การวิเคราะห์อัลกอริทึม
สมชาย ประสิทธิ์จูตระกูล
การวเิคราะหอ์ลักอรทิมึ แบบทดลอง และแบบคณติวเิคราะห์
การนบัจาํนวนการทาํงานของคาํส ัง่พืน้ฐาน
อตัราการเตบิโตของฟงักช์นั
สญักรณเ์ชงิเสน้กาํกบั
การวเิคราะหก์ารทาํงาน แบบลําดบั, แบบเลอืกทํา, แบบวงวน
หัวข้อ
ขั้นตอนการออกแบบอัลกอริทึม
มปีญัหา
หาวธิแีกไ้ข
ยอมรบัได ้?
หมดหวงั?
ปรบัขอ้กาํหนดของปญัหา
เร ิม่
จบ
Y
N Yยอมรบัได ้?
N
เพือ่ศกึษาประสทิธภิาพของอลักอรทิมึ เวลาการทํางาน ปรมิาณหน่วยความจําทีใ่ชใ้นการทํางาน
จะเนน้วเิคราะหเ์ฉพาะเวลาการทาํงาน
การวิเคราะห์อัลกอริทึม
เวลาการทาํงาน
ปรมิาณขอ้มลู
Mathematical Analysis
Experimental analysis แปลงอลักอรทิมึเป็นโปรแกรม สัง่ทํางานกบัขอ้มลูทดสอบ จับเวลาการทํางาน บนัทกึผล วเิคราะหห์าความสมัพันธข์องเวลาการทํางานกบัปรมิาณขอ้มลู
การวิเคราะห์อัลกอริทึม Selection Sort
selectionSort( d[1..n] ) {for (k = n; k > 1; k--) {maxI = 1for (i = 2; i <= k; i++)if (d[i] > d[maxI]) maxI = i
d[k] d[maxI]}
}
Selection Sort (ภาษา C)
void selectionSort(int d[], int n) {int k, i;for (k = n - 1; k > 0; k--) {int maxI = 1;for (i = 0; i <= k; i++)if (d[i] > d[maxI]) maxI = i;
int t = d[k]; d[k] = d[maxI];d[maxI] = t;
}}
เขียนโปรแกรมทดลองจับเวลา#include <stdio.h>#include <stdlib.h>#include <windows.h>
int main(int argc, char *argv[]) {int i, k, n, repeat = 10;for( n = 0; n<=20000; n+=2000) {
int *d = malloc( n * sizeof(int) );long sum = 0;for (k=0; k<repeat; k++) {
for (i=0; i<n; i++) d[i] = i; long start = GetTickCount();selectionSort(d, n);sum += GetTickCount() - start;
}printf("%d \t %f \n", n, (float)sum/repeat);
}system("PAUSE"); return 0;
}
Selection Sort (ภาษา Java)
static void selectionSort(int[] d) {for (int k = d.length-1; k > 0; k--) {int maxI = 1;for (int i = 0; i <= k; i++)if (d[i] > d[maxI]) maxI = i;
int t = d[k];d[k] = d[maxI];d[maxI] = t;
}}
เขียนโปรแกรมทดลองจับเวลาpublic class TestSelectionSort {
public static void main(String[] args) { int repeat = 10;for (int n = 0; n <= 20000; n += 2000) {
int[] d = new int[n];long sum = 0;for (int k = 0; k < repeat; k++) {
for (int i = 0; i < n; i++) d[i] = i;long start = System.currentTimeMillis();selectionSort(d);sum += System.currentTimeMillis() - start;
}System.out.printf("%d \t %f \n",
n, (double)sum/repeat);}
} for (int i = 0; i < 10000; i++)selectionSort(new int[1]);
ภาษา C : ใช ้GNU-C Compiler (3.4.2) optimize และไม ่optimize
ภาษา Java : ใช ้Java 6 (build 1.6.0_14-b08) interpreted-only mode
(option –Xint) Compilation to native code
(เรยีกเมท็อดซํ้า 10,000 ครัง้ กอ่นทํางานจรงิ)
Lenovo X200Intel CoreTM 2 DuoP8400 @ 2.26GHz3GB RamWindows XP
สั่งทํางาน + บันทึกผล
nJava (‐Xint)
Java(Native) GNU C
GNU C‐o3
0 0.0 0.0 0 0.02000 90.6 6.3 9.4 3.14000 359.4 25.0 39 9.46000 806.2 54.6 84.4 21.88000 1425.0 98.5 151.6 35.9
10000 2231.2 156.2 237.5 57.712000 3190.6 220.4 343.7 82.714000 4359.5 300.0 467.2 112.316000 5675.0 393.7 610.9 148.218000 7160.6 500.0 773.5 184.120000 8862.3 614.0 957.8 226.2
เปรียบเทียบเวลาการทํางาน
Selection Sort
ปรมิาณขอ้มลู
mSec.
t n2
ใช้จํานวนการทํางานของคําสั่งแทนเวลา static int counter = 0;static void selectionSort(int[] d) {
counter = 1 + d.length + d.length - 1;for (int k = d.length-1; k > 0; k--) {
int maxI = 1;counter += 2 + k+2 + k+1;for (int i = 0; i <= k; i++) {
counter += 1;if (d[i] > d[maxI]) {
maxI = i; }
}counter += 3;int t = d[k]; d[k] = d[maxI]; d[maxI] = t;
}}
counter += 1;
เขียนโปรแกรมทดลองนับคําสั่งpublic class TestSelectionSort {
public static void main(String[] args) { int repeat = 10;for (int n = 0; n <= 20000; n += 2000) {
int[] d = new int[n];long sum = 0;for (int k = 0; k < repeat; k++) {
for (int i = 0; i < n; i++) d[i] = i;counter = 0;selectionSort(d);sum += counter;
}System.out.printf("%d \t %f \n",
n, (double)sum/repeat);}
}
นับจํานวนการทํางานของคําสั่ง
0
100000000
200000000
300000000
400000000
500000000
600000000
700000000
counter
Selection Sortt n2
ปรมิาณขอ้มลู
#operations
นับเฉพาะคําสั่งตัวแทน static int counter = 0;static void selectionSort(int[] d) {
for (int k = d.length-1; k > 0; k--) {int maxI = 1;for (int i = 0; i <= k; i++) {
counter += 1;if (d[i] > d[maxI]) {
maxI = i;}
}int t = d[k]; d[k] = d[maxI]; d[maxI] = t;
}}
นับทุกคําสั่ง vs. นับคําสั่งตัวแทน
0
100000000
200000000
300000000
400000000
500000000
600000000
700000000
0
2000
4000
6000
8000
1000
0
1200
0
1400
0
1600
0
1800
0
2000
0
all operations
only barometer operation
Selection Sortt n2
ไมต่อ้งเขยีนเป็นโปรแกรม ไมต่อ้งส ัง่ทาํงานจรงิ ไมต่อ้งวาดกราฟ วเิคราะหจ์ากอลักอรทิมึ
Mathematical Analysis
selectionSort( d[1..n] ) {for (k = n; k > 1; k--) {maxI = 1for (i = 2; i <= k; i++)if (d[i] > d[maxI]) maxI = i
d[k] d[maxI]}
}
n
k 2
k
i 21
n
kk
21
1
1
n
jj
2)1(
nn
22
2 nn
คาํส ัง่พืน้ฐาน คอืคาํส ัง่ที่ ใชเ้วลาการทํางานไมเ๋กนิคา่คงตวัคา่หนึง่ ใชเ้วลาการทํางานไมแ่ปรตามขนาดของ input เป็นคําสัง่พืน้ ๆ เชน่ + - * / if เปรยีบเทยีบ return break...
คําสั่งตัวแทนต้องเป็นคําสั่งพื้นฐาน
selectionSort( d[1..n] ) {for ( k = n; k > 1; k-- ) {m = maxI(d, k)d[k] d[m]
}}
เวลาการทาํงานแปรตามจาํนวนการทาํงานของคาํส ัง่
จาํนวนการทาํงานของคาํส ัง่ แปรตามจาํนวนการทาํงานของคาํส ัง่ตวัแทน
เพือ่ความงา่ย เราวเิคราะหอ์ลักอรทิมึเชงิเวลาดว้ย การหาความสมัพนัธข์อง จํานวนการทํางานของคําสัง่ตวัแทน กบัปรมิาณขอ้มลู
การวิเคราะห์อัลกอริทึม
จํานวนการทํางานของคําสัง่ตวัแทน
ปรมิาณขอ้มลู
(เวลาการทํางาน)
t n2
ลาํบาก : ถา้วดัจากขนาด (จาํนวนบติ) ของ input
งา่ยขึน้ : พจิารณาวา่ขนาดของ input แปรตามคา่อะไรของ input
ตวัอยา่ง : sort( d[1..n] ) input เป็นอาเรยข์องจํานวน n ชอ่ง แตล่ะจํานวนมคีา่จํากดั (int ในจาวามคีา่ –231 ถงึ 231 – 1) ดงันัน้ n แทนปรมิาณขอ้มลู
วัดปริมาณข้อมูลขาเข้าอย่างไร ?for (i = 1; i <= n; i++)for (j = i+1; j <= n; j++)sum += cosine(d[i][j])*i;
เปรียบเทียบผลการวิเคราะห์
for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)sum += j;
222)1(
)(1
22
1111 1
nnnnn
ininn
i
n
i
n
i
n
i
n
ij
2
11 11 nn
n
i
n
i
n
j
แบบใดเร็วกวา่ ?
เปรียบเทียบเวลาการทํางาน
22
2 nn
2n จํานวนการทํางานของคําสัง่ : มากกวา่
คําสัง่ตวัแทน : ใชเ้วลามากกวา่จํานวนการทํางานของคําสัง่ : นอ้ยกวา่
คําสัง่ตวัแทน : ใชเ้วลานอ้ยกวา่
สรปุลําบาก วา่ แบบใดเร็วกวา่
for (i = 1; i <= n; i++)for (j = i+1; j <= n; j++)sum += cosine(d[i][j])*i;
for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)sum += j;
เปรียบเทียบอัตราการเติบโต
22
2 nn2nn
10204080
160320640
1280
100400
16006400
25600102400409600
1638400
45190780
31601272051040
204480818560เพ
ิม่ขึน้ทลีะ
2 เทา่
เพิม่ขึน้ทลีะ
4 เทา่
เพิม่ขึน้ทลีะ
4 เทา่
4444444
4.224.114.054.034.014.014.00
สรปุไดว้า่ทัง้คู่มอีตัราการเตบิโตเทา่กนั
เปรียบเทียบอัตราการเติบโต
1000
2nn
10204080
160320640
128025605120
100200400800
160032006400
128002560051200
14
1664
25610244096
1638465536
262144
เพิม่ขึน้ทลีะ
2 เทา่
เพิม่ขึน้ทลีะ
4 เทา่
เพิม่ขึน้ทลีะ
2 เทา่ 2
22222222
444444444
10n
0
10000
20000
30000
40000
50000
60000
70000
10 20 40 80 160 320 640 1280 2560
เมือ่ n มากพอควรn2/1000 จะมากกวา่ 10n
10n โตชา้กวา่ n2/1000
อัตราการเติบโต
0
5E+16
1E+17
1.5E+17
2E+17
2.5E+17
3E+17
3.5E+17
4E+17
4.5E+17
5E+17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
n^n
n!
2^n
n^3
n^2
n log n
n
log n
nn
2n
n3
n2
อัตราการเติบโต
0
2E+11
4E+11
6E+11
8E+11
1E+12
1.2E+12
1.4E+12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
n!
2^n
n^3
n^2
n log n
n
log n
2n
n3
n2
อัตราการเติบโต
0
5000
10000
15000
20000
25000
30000
35000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2^n
n^3
n^2
n log n
n
log n
2n
n3
n2
อัตราการเติบโต
0
500
1000
1500
2000
2500
3000
3500
4000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
n^3
n^2
n log n
n
log n
n3
n2
อัตราการเติบโต
0
50
100
150
200
250
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
n^2
n log n
n
log n
n2
อัตราการเติบโต
0
2
4
6
8
10
12
14
16
18
20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
n log n
n
log n
ทบทวนสูตรคณิตศาสตร์ที่ใช้บ่อย
2)1(
1
nnkn
k
Sn = n + (n-1) + ... + 1Sn = 1 + 2 + ... n
2Sn = n(n+1)Sn = n(n+1)/2
)21(2
)1(
3
nnkn
k
ทบทวนสูตรคณิตศาสตร์ที่ใช้บ่อย
an bb na loglog
nnn 2loglog 222
baba
baab
logloglog
logloglog
log na = a log n
nb
ba loglog an bb loglog ab
bnloglog
ทบทวนสูตรคณิตศาสตร์ที่ใช้บ่อยจํานวนเต็ม n หารดว้ย 2 (ปัดเศษทิง้) กีค่รัง้ จงึจะเทา่กบั 1
12
kn 2k = n, log2 2k = log2 n, k = log2 n
31 15 7 3 132 16 8 4 2 1
จํานวนเต็ม n หารดว้ย 3 (ปัดเศษทิง้) กีค่รัง้ จงึจะเทา่กบั 1log3 n
จํานวนเต็ม n หารดว้ย 4 (ปัดเศษทิง้) กีค่รัง้ จงึจะเทา่กบั 1log4 n
ทบทวนสูตรคณิตศาสตร์ที่ใช้บ่อย
111
0
x
xxnn
k
k
n
k
kxx0
)1(
n
k
kn
k
k xxx00
n
k
kn
k
k xx00
1
n
k
kn
j
j xx0
1
1
11 nx
20 + 21 + ... + 2n = 2n+1 – 1
ทบทวนสูตรคณิตศาสตร์ที่ใช้บ่อย
xx
k
k
11
0| x | < 1
111
0
x
xxnn
k
k
xxx
k
k
11
11
0
n
k
k
02
02
k
k 22
111
211
1
1
2210
n
k
k
23
311
0
n
kk
ตวัอยา่ง
สรุปอีกครั้งan bb na loglog
2)1(
1
nnkn
k
111
0
x
xxnn
k
k
xx
k
k
11
0
| x | < 1
baba
baab
logloglog
logloglog
f(n) vs. g(n)
( )lim( )n
f ng n
0 f(n) โตชา้กวา่ g(n)
f(n) โตเร็วกวา่ g(n)
c f(n) โตเทา่กบั g(n)
f(n) ≺ g(n)
f(n) ≻ g(n)
f(n) ≍ g(n)
c คอืคา่คงตวัทีไ่มใ่ช ่0
f(n) ≼ g(n) f(n) ≽ g(n)
f(n) โตไมเ่ร็วกวา่ g(n) f(n) โตไมช่า้กวา่ g(n)
ตัวอย่าง
1000)(,10)(
2nngnnf
1000
10lim2nn
n)()(lim
ngnf
n nn
10000lim
= 0
10n โตชา้กวา่ n2/1000
22 10)(,52)( nngnnnf
2
2
1052lim
nnn
n
22
2
105
102lim
nn
nn
n 51
105
102lim
nn
2n2 – 5n โตเทา่กบั 10n2
ถา้ f(n) และ g(n) เป็นฟงักช์นัทีห่าอนพุนัธไ์ด ้โดยที่
และหาคา่ของ ได้
จะไดว้า่
l'Hôpital's Rule
)(lim,)(lim ngnfnn
)()(lim
ngnf
n
)()(lim
)()(lim
ngnf
ngnf
nn
ตัวอย่าง
( ) log ( )f n n g n n
0
loglimn
nn
1 lnlimln10 n
nn
1 1lim
ln10 1 2n
nn
1 2limln10 n n
lnlimln10n
nn
log n โตชา้กวา่ n0.5
สามารถแสดงใหเ้ห็นวา่
(log n)100 โตชา้กวา่ n0.005
ตัวอย่าง
≺ ≺ ≺ ≺ ≺ ≺ ≺log n ≺ ≺ n ≺ n log n ≺ n2 ≺ n3 ≺ 2n ≺ nn
n2, 10n2, 2n2 – 10n, 5n2 + 8
มอีตัราการเตบิโตเทา่กนัหมด
n!log n5 = 5log n
n
สัญกรณ์เชิงเส้นกํากับselectionSort( d[1..n] ) {for (k = n; k > 1; k--) {maxI = 1for (i = 2; i <= k; i++)if (d[i] > d[maxI]) maxI = i
d[k] d[maxI]}
}
n
k 2
k
i 21
n
kk
21
1
1
n
jj
2)1(
nn
22
2 nn
= (n2 )Selection sort ใชเ้วลาเป็น (n2 )
การวิเคราะห์เชิงเส้นกํากับselectionSort( d[1..n] ) {for (k = n; k > 1; k--) {maxI = 1for (i = 2; i <= k; i++)if (d[i] > d[maxI]) maxI = i
d[k] d[maxI]}
}
n
k
n
i1 11 = O(n2 )
n
kn
1
n
k
k
i2 21
สัญกรณ์เชิงเส้นกํากับ
little – o
little – omega
Big – O
Big – Omega
Big – Theta
Asymptotic Notations
little - o
n0.98 o(n)
o(g(n)) = { f(n) | f(n) ≺ g(n) } โตชา้กวา่
106 o(n)log n o(n)
little - omega
n1.001 (n)
(g(n)) = { f(n) | f(n) ≻ g(n) } โตเร็วกวา่
n2 (n)2n (n)
Big - Theta
10 log n (log n)
(g(n)) = { f(n) | f(n) ≍ g(n) } โตเทา่กนั
2 + log n5 (log n)ln n (log n)
2ln
1ln
2ln/lnln
log2 n
nn
n
Big - O
32nln 3 O(n2)
O(g(n)) = { f(n) | f(n) ≼ g(n) } โตไมเ่ร็วกวา่
n2 + 7n O(n2)log n O(n2)
ln 3 < 1.099
Big - Omega
(n log n)
(g(n)) = { f(n) | f(n) ≽ g(n) } โตไมช่า้กวา่
20n log n + 2n (n log n)10n3 + 5n (n log n)
nn
สัญกรณ์เชิงเส้นกํากับ
o(g(n)) = { f(n) | f(n) ≺ g(n) } โตชา้กวา่
(g(n)) = { f(n) | f(n) ≻ g(n) } โตเร็วกวา่
(g(n)) = { f(n) | f(n) ≍ g(n) } โตเทา่กนั
= O(g(n)) (g(n))
O(g(n)) = { f(n) | f(n) ≼ g(n) } โตไมเ่ร็วกวา่
= o(g(n)) (g(n))
(g(n)) = { f(n) | f(n) ≽ g(n) } โตไมช่า้กวา่
= (g(n)) (g(n))n
O(g(n)) = { f(n) | f(n) ≼ g(n) }
O(g(n)) = { f(n) | มจีํานวน c > 0 และ n0 0
ทีท่ําให ้ f(n) cg(n) เมือ่ n n0 }
Big – O : ขอบเขตบน
g(n)
n0
f (n) O(g(n))
g(n) เป็นขอบเขตบนของ f(n)f (n)
cg(n)
n
(g(n)) = { f(n) | f(n) ≽ g(n) }
(g(n)) = { f(n) | มจีํานวน c > 0 และ n0 0
ทีท่ําให ้ f(n) cg(n) เมือ่ n n0 }
Big – Omega : ขอบเขตล่าง
f (n)cg(n)
n0
f (n) (g(n))
g(n) เป็นขอบเขตลา่งของ f(n)
n
(g(n)) = { f(n) | f(n) ≍ g(n) }
(g(n)) = { f(n) | มจีํานวน c1, c2 > 0 และ n0 0
ทีท่ําให ้c1g(n) f(n) c2g(n) เมือ่ n n0 }
Big – Theta : ขอบเขตกระชับ
f (n)c1g(n)
n0
f (n) (g(n))
g(n) เป็นขอบเขตกระชบัของ f(n) c2g(n)
เขา้ใจพฤตกิรรมเมือ่พารามเิตอรม์คีา่มาก 5n3 – 2n2 – nlog n +7 ( n3 )
วเิคราะหไ์ดง้า่ย
จดักลุม่ฟงักช์นัตามอตัราการเตบิโต (1), ( log n ), ( n ), ...
สัญกรณ์เชิงเส้นกํากับ
4
3 21
n
i
n
ij
n
i
n
j1 11
n
in
1= n2 = O(n2)
วิเคราะห์ง่ายขึ้นด้วย , ,
1 12 2
k kn n
i i
i n
จงแสดงวา่
1
nk
in
1kn
1O kn
kn
i
kn
i
ni
4/
11 22/
2 kn
i
n
4/
1 41
4
kn
1 kn
1
1 2
k
kn
ini 1 2 3 4 5 6 7 8 9 10 11 12
0 0 0 0 0 0 0 0 0 6 6 6
ตัวอย่าง
จงแสดงวา่
2 O( )n n
)(O
2
2log
0nhnn
hh
n
hh
n
hh
hnhn 22 log
0
log
0 22
0 2hh
hnxxxx
h
h
111 2
0
20
1
11x
hxh
h
20 1 xxhx
h
h
20 2/112/1
21
h
hh
2
2/12/1
2
ตัวอย่าง : log2 n!n! = n (n-1) ... 2 1
n n ... n n = nn
log2 n! log2 nn = n log2 n เมื่อ n 1n! = n (n-1) ... (n/2) (n/2-1) ... 2 1
n/2 n/2 ... n/2 1 ... 1 1 (n/2)n/2
log2 n! (n/2) log2 (n/2) = (n/2) log2 n – (n/2) 0.4n log2 n เมื่อ n 25
ขอบเขตบน
ขอบเขตลา่ง
0.4n log2 n log2 n! n log2 n เมื่อ n 25
log2 n! (n log n)
การเขียนฟังก์ชันในรูปของ , แบบง่ายๆ ผลบวกของพจนห์ลายพจน ์เลอืกพจนท์ีโ่ตเร็วสดุ
ขอ้สงัเกต cg(n) = (g(n)) เมือ่ c เป็นคา่คงตวั loga n = (logb n) เพราะ loga n = (logab) logb n .
เชน่
aknk + ak-1nk-1 +...+ a0 = (nk)0.001n3 + 7000n2 – 11 = (n3) log2 n10 = 10(log2 n) = (log n) .
( ( )) ( )t n t n
2
1 1( ) ( 1) / 2 ( )
n n
i ii i n n n
อัตราการเติบโต constant : ( 1 ) logarithmic : ( log n ) polylogarithmic : ( log c n ) , c 1 sublinear : ( na ) , 0 < a < 1 linear : ( n ) quadratic : ( n2 ) polynomial : ( nc ) , c 1 exponential : ( cn ) , c > 1
การทาํงานแบบลาํดบั
การเลอืกทาํ
การทาํงานแบบวงวน
การทาํงานแบบเรยีกซํา้
การวิเคราะห์อัลกอริทึม การทํางานแบบลําดับ
( f1(n) )( g1(n) )
( f2(n) )( g2(n) )
h(n)
h(n) O( f1(n) + f2(n) )h(n) ( g1(n) + g2(n) )
การทํางานแบบลําดับ
( n2 )( n )
( n )( n )
h(n)
h(n) O( n2 + n) = O( n2) h(n) ( n + n) = ( n )
การทํางานแบบลําดับ
( n2 )( n2 )
( n )
h(n)
h(n) O( n2 )h(n) ( n2 )
การทํางานแบบลําดับ
( n )( n )
( n2 )( 1 )
h(n)
h(n) O( n2 )h(n) ( n )
การเลือกทํา
f1(n)
f2(n) f3(n)
max( f1(n)+ f2(n) , f1(n)+ f3(n) )
การทํางานแบบวงวน
for (k = 1; k <= n; k++) {P(k)
}
P(k) ใชเ้วลา t(k)
n
kkt
1)(
ตัวอย่าง : for
for (k = 1; k <= n; k++) {process( d, k )
}
process(d,k) ใชเ้วลา ( k2 )
n
kk
1
2 )(
n
kk
1
2
6
)12)(1( nnn
)( 3n
ตัวอย่าง : for
for (i = 1; i <= n; i++)for (j = 1; j <= n; j++) sum += d[i][j]
n
i
n
j1 1)1(
n
in
1)(
)( 2n
n
in
1
ตัวอย่าง : for
for (i = 1; i <= n; i++)for (j = 1; j <= i; j++) sum += d[i][j]
n
i
i
j1 1)1(
n
ii
1)(
)( 2n
2
)1(nn
n
ii
1
ตัวอย่าง : for
for (i = 2; i <= m-1; i++)for (j = 3; j <= i; j++) sum += d[i][j]
1
2 3
)1(m
i
i
j
1
2
)(m
ii
)())(( 22 mmm
)(1
mim
i
1
2
m
ii
ตัวอย่าง : while
i = 0, j = nwhile ( i < j ) {i += 1j -= 1
} (n)
log10( n ) {c = 0while (n > 1) {n = n / 10c++
}return c
} (log n)
110 10log n
n
ตัวอย่าง : Binary SearchbinarySearch( d[1..n], x ) { left = 1, right = nwhile ( left <= right ) {mid = (left + right) / 2if (x = d[mid]) return midif (x < d[mid])right = mid - 1
elseleft = mid + 1
}return -1;
}right – left + 1 คอืจํานวนขอ้มลูในชว่งทีส่นใจคน้
คา่ของ right – left + 1 คอื n ในรอบแรก ลดลงรอบละครึง่
O(log n)
10005001256231157310
1
2 2log nn
เวลาการทาํงานของอลักอรทิมึ ขึน้กบั
ปรมิาณขอ้มลูขาเขา้ชา้เมือ่ปรมิาณมาก เร็วเมือ่ปรมิาณนอ้ยแตก่็มอีลักอรทิมึ ทีใ่ชเ้วลาคงตวัไมข่ึน้กบัปรมิาณ
ลกัษณะของขอ้มลูขาเขา้ขอ้มลูบางลกัษณะ ใชเ้วลาทํางานมากขอ้มลูบางลกัษณะ ใชเ้วลาทํางานนอ้ยแตก่็มอีลักอรทิมึ ทีล่กัษณะขอ้มลูไมม่ผีลตอ่เวลาการทํางาน
การวิเคราะห์อัลกอริทึม
การหาตัวหมู่มาก
เวลาการทาํงาน
ปรมิาณขอ้มลู
กรณีไมม่ีตวัหมูม่าก
กรณีตวัแรกคอืตวัหมูม่าก
กรณีมตีวัหมูม่ากแตค่รึง่แรก
ไมใ่ชต่วัหมูม่าก
hasMajority( d[1..n] ) {for (i = 1; i <= n; i++) {
c = 0;for (j = 1; j <= n; j++) if (d[i] == d[j]) c++if (c > n/2) return TRUE
}return FALSE
}
เวลาการทํางานขึ้นกับลักษณะข้อมูลseqSearch( d[1..n], x ) {for (k = 1; k <= n; k++) {if (d[k] = x) return k
}return -1
}
เวลาการทาํงาน
ปรมิาณขอ้มลู
พบตวัแรกของอาเรย์
การค้นแบบลําดับseqSearch( d[1..n], x ) {for (k = 1; k <= n; k++) {if (d[k] = x) return k
}return -1
}พบที่ d[1] เปรยีบเทยีบ 1 ครัง้ " d[2] " 2 ครัง้ ... ... ... ...
" d[k] " k ครัง้
มขีอ้มลู n ตวั, ถา้ขอ้มลูแตล่ะตวัมโีอกาสถกูคน้เทา่ ๆ กนั 1/n
จํานวนการเปรยีบเทยีบเฉลีย่ =
n
kk
n1
12
1
n
n
kk
n 1
1
2
)1(1 nnn
ศกึษาประสทิธภิาพของอลักอรทิมึ โดยไมต่อ้งเขยีนโปรแกรมและส ัง่ทาํงานจรงิ
หาความสมัพนัธร์ะหวา่งเวลาการทาํงานกบัปรมิาณขอ้มลู และ ลกัษณะขอ้มลู
หาอตัราการเตบิโตของเวลาการทาํงาน
แทนเวลาดว้ยจาํนวนการทาํงานของคาํส ัง่ตวัแทน
วเิคราะหไ์ดง้า่ยขึน้ดว้ยสญักรณเ์ชงิเสน้กาํกบั
ใชด้ใีนการเปรยีบเทยีบอลักอรทิมึ
สรุป