آموزش ساختمان داده ها - بخش اول

42
هان داده ساختماfaradars.org/fvds9402 مدرس: فرشید شیرافکن دانشجوی دکتری تهران نشگاه دا( سی ارشد کارشنا کارشناسی و: م افزار کامپیوتر نر( ) دکتری: نفورماتیک بیو ا) هان داده ساختما1 ﻓﺮادرسFaraDars.org

Upload: faradars

Post on 17-Aug-2015

55 views

Category:

Education


5 download

TRANSCRIPT

Page 1: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

:مدرسفرشید شیرافکن

دانشگاه تهران دانشجوی دکتری (بیو انفورماتیک: دکتری( )کامپیوتر نرم افزار: کارشناسی و کارشناسی ارشد )

ساختمان داده ها

1

فرادرس

FaraDars.org

Page 2: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

سرفصل

(اجراییپیچیدگی)اجراییمرتبه1.

بازگشتیتوابع2.

آرایه3.

پشتهوصف4.

پیوندیلیست5.

درخت6.

گراف7.

سازیمرتب8.

سازیدرهم9.

2

فرادرس

FaraDars.org

Page 3: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402منابعکرمن•هورویتز•دکتر قدسی•لیپ شوتز•شیرافکن•

3

فرادرس

FaraDars.org

Page 4: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

اندازه nی یک الگوریتم، تابعی است که مدت زمان اجرای استفاده شده توسط الگوریتم را بر حسب تعداد داده های ورودپیچیدگی . می گیرد

پیچیدگی اجرایی

4

namenotation

constantO(1)

linearO(n)

logarithmicO(logn)

quadraticO(n^2)

polynomialO(n^c)

exponentialO(c^n)

factorialO(n!)

فرادرس

FaraDars.org

Page 5: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مرتبه اجرایی توابع چند جمله ای

:در صورتی که داشته باشیم

:مثال

5

)()(...)( 21 mmm nOnfcnnnnnf

)(435)( 22 nOnnnf

)()!()2()()lg()()(lg)1( 2 nn nOnOOnOnnOnOnOO

nn lglog2

فرادرس

FaraDars.org

Page 6: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

نمادهای پیچیدگی اجرایی

بزرگاویتوابعازایمجموعهبهg(n)،O(g(n))مفروضپیچیدگیتابعبرای:یعنیعبارت:داریمهمهبرایبطوریکهدارند،وجودوcثابتهایآنهابرایکهدارداشاره

بزرگامگاازایمجموعهبه،g(n)مفروضپیچیدگیتابعبرای:یعنیعبارت

:داریمهمهبرایبطوریکهدارند،وجودوcثابتهایآنهابرایکهدارداشارهتوابع

تتاو:یعنیعبارت

6

،

)()( ngOnf

)()( ncgnf 0nn 0n

))(()( ngnf

)()( ncgnf

))(( ng

0n0nn

)()( ngnf )()( ngOnf )()( ngnf

فرادرس

FaraDars.org

Page 7: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

: نشان دهید

7

)(10 22 nOnn

1010210 222 nnnnnn

22 10 cnnn

22 210 nnn فرادرس

FaraDars.org

Page 8: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

: نشان دهید

:حل

:یعنی

8

)(2

)1( 2nOnn

22

)1( 2nnn

2

2

)1(cn

nn

2

1,00 cn

022

)1( 2

nnnn

فرادرس

FaraDars.org

Page 9: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

9

فرادرس

FaraDars.org

Page 10: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

: نشان دهید

:حل

: یعنی

10

2

2

1n

nn

22

4

1

22n

nn

2

2

1cn

nn

4

1,20 cn

2422

22

nnnn

فرادرس

FaraDars.org

Page 11: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

:نشان دهید که :جواب

:بنابراین در مثال های قبل دیدیم که و

11

،

2

2

1n

nn

2

2

1nO

nn

2

2

1n

nn

2

2

1n

nn

فرادرس

FaraDars.org

Page 12: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

خواص توابع رشد

:بازتابی(1

.تراگذاری(2

:تتابرایمثال

:داردتقارنخاصیتتتا(3

4)Oدارندترانهادهتقارنخاصیت:

12

،

))(()())(()( nfngngnf

))(()())(()(

))(()(nhnf

nhng

ngnf

))(()())(()( nfngngOnf

))(()()),(()()),(()( nfnfnfnfnfOnf

فرادرس

FaraDars.org

Page 13: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

ifپیچیدگی دستور

:کنیدتوجهزیرifدستوربهif(cond)

block1

else

block2

:بااستبرابرحالتبدتریندراجرازمان

Max( time(block1) , time(block2) )

13

،

فرادرس

FaraDars.org

Page 14: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مرتبه اجرایی حلقه های ساده

(a<=b):زیر را در نظر بگیریدforحلقه

: تکرار تعداد

.این مقدار اعشاری بود، حد باالی آن را در نظر بگیریداگر

.است(sequence of statement)، توالی از دستورها sاز منظور

14

for (i=a ; i<=b ; i=i+k ) s;

k

ab 1

for (i=b ; i>=a ; i=i-k ) s;فرادرس

FaraDars.org

Page 15: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار دستور داخل حلقه را مشخص کنید

: جواب

:تعداد تکرار

o(n): مرتبه اجرایی

15

for ( i=1 ; i<=n ; i=i+1 ) s;

nn

1

11

فرادرس

FaraDars.org

Page 16: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار دستور داخل حلقه را مشخص کنید

: جواب

:تعداد تکرار

o(n): مرتبه اجرایی

16

for ( i=3 ; i<=n ; i=i+2 ) s;

122

13

nn

فرادرس

FaraDars.org

Page 17: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال.تعداد تکرار دستور داخل حلقه را مشخص کنید

: جواب

:تعداد تکرار

o(n): مرتبه اجرایی

17

for ( i=9 ; i<3n+4 ; i=i+5 ) s;

15

3

5

943

nn

فرادرس

FaraDars.org

Page 18: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مرتبه ثابت

.را مشخص کنیدx=x+1مرتبه اجرایی دستور

: جواب

18

i=n;while(i>1){

i=i % 2;x=x+1;

}

)1(O

فرادرس

FaraDars.org

Page 19: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مرتبه لگاریتمی

: حلقه زیر را در نظر بگیرید

: تعداد تکرار

.اگر این مقدار صحیح نبود، حد باالی آن را در نظر بگیرید

19

for ( i=a ; i<=b ; i=i*k ) s;

1loglog a

k

b

k

for ( i=b ; i>=a ; i=i/k ) s;فرادرس

FaraDars.org

Page 20: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

:جواب

20

for ( i=1 ; i<=8 ; i=i*2 ) s;

41loglog 1

2

8

2

فرادرس

FaraDars.org

Page 21: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

:جواب

21

for ( i=27 ; i<=n ; i=i*3 ) s;

)(log2log1loglog 33

27

33

nnn O

فرادرس

FaraDars.org

Page 22: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

:جواب

22

for ( i=n ; i>=16 ; i=i/4 ) s;

)(log1log1loglog 44

16

44

nnn O

فرادرس

FaraDars.org

Page 23: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

: جواب

:می توان نوشت

: بنابراین تعداد تکرار برابر است با

23

for ( i=n ; i>=1; i=i - i/3 )s;

1log1loglog 2/3

1

2/32/3 nn

for ( i=n ; i>=1; i= i / (3/2) )

s;2

33

2 iii

فرادرس

FaraDars.org

Page 24: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

حلقه های تودرتو

.تعداد تکرار را مشخص کنید

: حل

n: تعداد تکرار هر حلقه

: sتعداد تکرار دستور

24

for ( i=1 ; i<=n ; i++ )for ( j=1 ; j<=n ; j++)

s;

2n

فرادرس

FaraDars.org

Page 25: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

: جواب

25

for ( i=2 ; i<=n ; i=i+4 )for ( j=n ; j>3 ; j=j-2 )

s;

)(2

3

4

12 2nOnn

فرادرس

FaraDars.org

Page 26: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

: جواب

26

for ( i=1 ; i<=n ; i=i*2 )for ( j=1 ; j<=n ; j++ )

s;

)lg()1(lg nnOnn

فرادرس

FaraDars.org

Page 27: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

حلقه های پشت سرهم

.تعداد تکرار را مشخص کنید

: جواب

یا

27

for ( i=1 ; i<=n ; i++) {s;

}for ( j=1 ; j<=m ; j++) {

s; }

)( mnO

)),(max( mnO

فرادرس

FaraDars.org

Page 28: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

ترکیب حلقه های تودر تو و پشت سرهم

.تعداد تکرار را مشخص کنید

: جواب

28

for ( i=1 ; i<=n ; i++) {for ( j=1 ; j<=n ; j++) {

s;}

}for ( k=1 ; j<=n ; k++) {

s; }

)()),(max( 22 nOnnO

فرادرس

FaraDars.org

Page 29: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

وابسته حلقه های تودرتو

.تعداد تکرار را مشخص کنید

: جواب

:مجموع تعداد تکرار

: روش دوم

29

for ( i=1 ; i<=n ; i++ )for ( j=1 ; j<=i ; j++ )

s;

i 1 2 3 … n

تعداد تکرار 1 2 3 000 n

)(2

)1(...321 2nO

nnn

2

)1(1

11 1

nni

n

i

n

i

i

j

فرادرس

FaraDars.org

Page 30: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

: جواب

:مجموع تعداد تکرار

30

for ( i=1 ; i<=n ; i=i*2 )for ( j=1 ; j<=i ; j++ )

s;

i 1 2 4 … n

تعداد تکرار 1 2 4 000 n

)(1212212

122...222...421 lg

1lglog210 2 nOnn n

nn

فرادرس

FaraDars.org

Page 31: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

: جواب

تکرارکلتعدادشود،میتکرارمرتبهnاولحلقهچون.شودمیتکرارمرتبه(2n-1)داخلیحلقهدوکهدیدیمقبلمثالدر:بااستبرابر

31

for ( k=1 ; k<=n ; k++ )for ( i=1 ; i<=n ; i=i*2 )

for ( j=1 ; j<=i ; j++ )s;

)()12( 2nOnn

فرادرس

FaraDars.org

Page 32: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

: جواب

:مجموع تعداد تکرار

32

for ( i=1 ; i<=n ; i++ )for ( j=1 ; j<=n ; j=j+i )

s;

i 1 2 3 … n

تعداد تکرار n n/2 n/3 000 1

)lg(ln)1

...3

1

2

11(1...

32nnOnn

nn

nnn

فرادرس

FaraDars.org

Page 33: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

: جواب

:مجموع تعداد تکرار

33

for ( i=1 ; i<=n ; i=i*3 )for ( j=i ; j<=n ; j++ )

s;

i 1 3 9 … n

تعداد تکرار n-1+1 n-3+1 n-9+1 000 n-n+1

)lg(2

13)1)(1(log)...931()1)(1(log 33 nnO

nnnn nn

2

13

13

133...333...931

1loglog210

3

3

n

n

n

n

فرادرس

FaraDars.org

Page 34: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد تکرار را مشخص کنید

: جواب

:مجموع تعداد تکرار

34

for ( i=1 ; i<=n ; i++ )for ( j=1 ; j<=log(i) ; j++ )

s;

i 1 2 … n

تعداد تکرار log(1) log(2) 000 log(n)

)!log()...21log()log(...)2log()1log( nnn

)lg()!log( nnn

فرادرس

FaraDars.org

Page 35: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

تغییر مقدار نهایی شمارنده

.تعداد تکرار را مشخص کنید

: جواب

:مجموع تعداد تکرار

35

for ( i=1 ; i<=n ; i++ )for ( j=1 ; j<=n ; j++)

{ s;n=n-1; }

i 1 2 3 …

تعداد تکرار n/2 n/4 n/8 000

)(2/11

2/1...)

8

1

4

1

2

1(...

842nOnnn

nnn

فرادرس

FaraDars.org

Page 36: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

پیچیدگی در حالت فراخوانی تابع

.باشد، پیچیدگی را مشخص کنیدO(k)برابر f(k)با فرض اینکه پیچیدگی زمانی تابع : مثال

: جواب

: مثال

:جواب

36

for ( i=1 ; i<=n ; i++ )f(n);

)( 2nOnn

for ( i=1 ; i<=n ; i++ )f(i);

)(2

)1(...21)(...)2()1( 2nO

nnnnfff

فرادرس

FaraDars.org

Page 37: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

مسئله خرس قطبی

یکیروزهراو.استکردهذخیرهغاریدررا(nتا،1،2هایاندازهبهدقیقا)گوشتقطعهnقطبیخرس،سردزمستانیکدربود،وجزاگر.خوردمیکامالراآنبود،فردیعددگوشتیاندازهاگر.کندمیانتخابتصادفیصورتبهراهاگوشتقطعهایناز

سخرنباشد،موجودگوشتیاگر.دهدمیقرارغاردرمجددارادیگرنصفوخوردمیراآننصفیککند،مینصفدقیقاراآنبود؟خواهدچگونهعمرخرسازباقیماندهروزهایبزرگ،خیلیهایnبرایالگوریتم،اینبا.میردمی:حل

برای.شودمیتمامهاگوشتروز7ازبعدبخوردکهترتیبیهربا.باشندمی4و3و2و1برابرگوشتهایقطعه،n=4فرضباn=82مسئلهاینجواب.است15جوابn-1است.

:دومروش

37

)(2

2

11

1...)

4

1

2

11(...

42nOnnn

nnn

فرادرس

FaraDars.org

Page 38: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

تابع

(رکوچکتیا)یکبرابرحاصلشود،گرفتهلگاریتمnازاگرکهدفعاتیتعدادبااستبرابرتابعاینخروجی.استکندبسیارتابعاینرشدبنابراین.شدخواهد

38

،

n*lg

24lg* 124

465536lg

316lg

*

*

12416

1241665536

فرادرس

FaraDars.org

Page 39: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

امگای کوچک وتعریف نماد اوی کوچک

f(n)= oعبارت (g(n)) برقرار است در صورتی که:

:برقرار است در صورتی که f(n)= (g(n))عبارت

: رابطه برقرار است: مثال

39

،

02

1lim

2/lim

3

2

nn

n

nn

)(2

32

non

0)(

)(lim

ng

nf

n

)(

)(lim

ng

nf

n

فرادرس

FaraDars.org

Page 40: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

تمرین

.تعداد تکرار و مرتبه اجرایی را در هر یک از حلقه های زیر مشخص کنید

40

for ( i=1 ; i<=n; i++ )for ( j=i ; j<=n ; j=j*3 )

s;

for ( i=1 ; i<=n ; i++ )for ( j=1 ; j<=i ; j++)for ( k=1; k<=j ; k++)

s;

for ( i=1 ; i<n/2 ; i++ )for( j=n/2 ; j<n ; j++)

for( k=0 ; k<i+j ; k++)s;

for ( t=1 ; t<=n-1 ; t++ ) {for( i=1 ; i<n-t ; i++) {

j=i+t;for( k=i ; k<=j-1 ; k++)

s;} }

فرادرس

FaraDars.org

Page 41: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

تمرین

: نشان دهید که

.کندمیحلزمانواحدیکدرمرتبهازالگوریتمیبارا8اندازهبهمسئلهیککامپیوتری:تمرینکرد؟خواهدحلزمانواحدیکدررامسئلههمانازایاندازهچهشود،برابر64کامپیوترسرعتاگر

41

،

)2( nn ne

)(lg2 2lg2n

n)1(lg

1

nn ))(lg(lglg ** nn

)()(lg* nOnn

nn 2log lg4

)(4 2lg nn )2(3 32 nn

O

)2( no

فرادرس

FaraDars.org

Page 42: آموزش ساختمان داده ها - بخش اول

ساختمان داده ها

faradars.org/fvds9402

42

این اسالید ها بر مبنای نکات مطرح شده در فرادرس« مجموعه فرادرس های ساختمان داده ها»

.تهیه شده است

.نماییدلینک زیر مراجعه برای کسب اطالعات بیشتر در مورد این آموزش به

faradars.org/fvds9402

فرادرس

FaraDars.org