การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... ·...

20
การวิเคราะห์อัลกอริทึม สมชาย ประสิทธิ์จูตระกูล การวิเคราะห์อัลกอริทึม แบบทดลอง และแบบคณิตวิเคราะห์ การนับจํานวนการทํางานของคําส งพื นฐาน อัตราการเติบโตของฟังก์ช ญกรณ์เช งเส นกํากับ การวิเคราะห์การทํางาน แบบลําดับ, แบบเลือกทํา, แบบวงวน หัวข้อ ขั้นตอนการออกแบบอัลกอริทึม มีปัญหา หาวิธีแก้ไข ยอมรับ ได้ ? หมด หวัง? ปรับข้อกําหนด ของปัญหา เริ่ม จบ Y N Y ยอมรับ ได้ ? N เพื่อศ กษาประส ทธิภาพของอัลกอริทึม เวลาการทํางาน ปริมาณหน่วยความจําที่ใช ในการทํางาน จะเน้นวิเคราะห์เฉพาะเวลาการทํางาน การวิเคราะห์อัลกอริทึม เวลาการทํางาน ปริมาณข้อมูล

Upload: others

Post on 26-Jul-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

การวิเคราะห์อัลกอริทึม

สมชาย ประสิทธิ์จูตระกูล

การวเิคราะหอ์ลักอรทิมึ แบบทดลอง และแบบคณติวเิคราะห์

การนบัจาํนวนการทาํงานของคาํส ัง่พืน้ฐาน

อตัราการเตบิโตของฟงักช์นั

สญักรณเ์ชงิเสน้กาํกบั

การวเิคราะหก์ารทาํงาน แบบลําดบั, แบบเลอืกทํา, แบบวงวน

หัวข้อ

ขั้นตอนการออกแบบอัลกอริทึม

มปีญัหา

หาวธิแีกไ้ข

ยอมรบัได ้?

หมดหวงั?

ปรบัขอ้กาํหนดของปญัหา

เร ิม่

จบ

Y

N Yยอมรบัได ้?

N

เพือ่ศกึษาประสทิธภิาพของอลักอรทิมึ เวลาการทํางาน ปรมิาณหน่วยความจําทีใ่ชใ้นการทํางาน

จะเนน้วเิคราะหเ์ฉพาะเวลาการทาํงาน

การวิเคราะห์อัลกอริทึม

เวลาการทาํงาน

ปรมิาณขอ้มลู

Page 2: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

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;

}

Page 3: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

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

Page 4: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

ใช้จํานวนการทํางานของคําสั่งแทนเวลา 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;

}}

Page 5: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

นับทุกคําสั่ง 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

Page 6: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

ลาํบาก : ถา้วดัจากขนาด (จาํนวนบติ) ของ 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

สรปุไดว้า่ทัง้คู่มอีตัราการเตบิโตเทา่กนั

Page 7: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

เปรียบเทียบอัตราการเติบโต

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

Page 8: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

อัตราการเติบโต

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

Page 9: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

ทบทวนสูตรคณิตศาสตร์ที่ใช้บ่อย

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

ตวัอยา่ง

Page 10: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

สรุปอีกครั้ง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

Page 11: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

ตัวอย่าง

( ) 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

Page 12: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

สัญกรณ์เชิงเส้นกํากับ

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

Page 13: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

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)

Page 14: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

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

Page 15: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

ตัวอย่าง

จงแสดงวา่

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

Page 16: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

การทาํงานแบบลาํดบั

การเลอืกทาํ

การทาํงานแบบวงวน

การทาํงานแบบเรยีกซํา้

การวิเคราะห์อัลกอริทึม การทํางานแบบลําดับ

( 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 )

Page 17: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

การทํางานแบบลําดับ

( 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

Page 18: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

ตัวอย่าง : 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

Page 19: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

ตัวอย่าง : 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

}

เวลาการทาํงาน

ปรมิาณขอ้มลู

พบตวัแรกของอาเรย์

Page 20: การวิเคราะห ์อัลกอร ิทึมsomchai/2110327/... · ใช้จํานวนการท ํางานของค ําสั่งแทนเวลา

การค้นแบบลําดับ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

ศกึษาประสทิธภิาพของอลักอรทิมึ โดยไมต่อ้งเขยีนโปรแกรมและส ัง่ทาํงานจรงิ

หาความสมัพนัธร์ะหวา่งเวลาการทาํงานกบัปรมิาณขอ้มลู และ ลกัษณะขอ้มลู

หาอตัราการเตบิโตของเวลาการทาํงาน

แทนเวลาดว้ยจาํนวนการทาํงานของคาํส ัง่ตวัแทน

วเิคราะหไ์ดง้า่ยขึน้ดว้ยสญักรณเ์ชงิเสน้กาํกบั

ใชด้ใีนการเปรยีบเทยีบอลักอรทิมึ

สรุป