درس طراحی الگوریتم ها (با شبه کد های c ++ )

249
م ها ت ی ور گ ل ی ا ح را ط درس کد های ه ب ش ا ب( c )++ واحد:اد عد ت3 ی) ن ی م ورا. پ ر) عف ج ده :) ن5 ی ک ه ب ه ت ها م ت ی ور گ ل ی ا ح را ط اب ن ک ع : ب) ی م م : ? ج ر مت ادD ژ) ن ر) عف ج ی م ق

description

درس طراحی الگوریتم ها (با شبه کد های c ++ ). تعداد واحد: 3 تهیه کننده : جعفر پورامینی منبع : کتاب طراحی الگوریتمها مترجم : جعفر نژاد قمی . فصل اول: کارایی ، تحلیل و مرتبه الگوریتم ها. این کتاب در باره تکنیک های مربوط به حل مسائل است. تکنیک ، روش مورد استفاده در حل مسائل است. - PowerPoint PPT Presentation

Transcript of درس طراحی الگوریتم ها (با شبه کد های c ++ )

Page 1: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ها الگوریتم درسطراحیهای) کد شبه ++(cبا

: واحد 3تعدادپورامینی : جعفر کننده تهیهالگوریتمها : طراحی کتاب منبع

قمی جعفر نژادمترجم :

Page 2: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

: اول فصل

الگوریتم مرتبه و تحلیل ، کاراییها

Page 3: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

حل به مربوط های تکنیک باره در کتاب این. است مسائل

مسائل حل در استفاده مورد روش ، تکنیکاست.

آن پاسخ دنبال به که است پرسشی ، مسئلههستیم.

Page 4: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

گام به گام روشی به منجر تکنیک بردن بکار. شود) ( می مسئله یک حل در الگوریتم

تحلیل یعنی الگوریتم، یک بودن منظورازسریع. حافظه و زمان لحاظ از آن

Page 5: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ایراد دو فارسی زبان به الگوریتم نوشتندارد:

شیوه- 1 این به پیچیده های الگوریتم نوشتن. است دشوار

الگوریتم- 2 فارسی توصیف از نیست مشخصچگونه

. کرد ایجاد کامپیوتری برنامه یک توان می

Page 6: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ترتیبی : 1-1الگوریتم جوی و جست

Void seqsearch ) int n const keytype S] [

keytype x, index& location)

location = 1;

while )location <= n && S]location[ ! = x( location;++

if )location > n ( location = 0;

Page 7: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

آرایه :1-2الگوریتم عناصر مجموع محاسبه

number sum )int n , const number s] [(

index i; number result;

result = 0; for )i = 1; i <= n; i++(

result = result + s]i[; return result;

Page 8: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تعویضی مرتب:1-3الگوریتم سازی

.nمسئله: کنید سازی مرتب نزولی غیر ترتیب به را کلید void exchangesort )int n , keytype S] [(

index i,j;

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

if ) S]j[ < S]i[( exchange S]i[ and S]j[;

Page 9: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ماتریسها ضرب:1-4 الگوریتم

void matrixmult )int n const number A ,] [ ] [ const number B ,] [ ] [

number C ,] [ ] [

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

for )i = 1; j <= n ; j++( C ]i[ ]j[ = 0;

Page 10: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

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

C ]i[]j[ = C]i[ ]j[ + A ]i[]k[ * B ]k[]j[

Page 11: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

کارآمد 1- 2 های الگوریتم ساخت اهمیت

دودویی جوی و جستتر سریع بسیار معموالترتیبی جوی و ازجست

است. انجام های مقایسه تعداد

و جست توسط شدهبا برابر دودویی lg nجوی

است .1 +

آرایه اندازهتعداد

مقایسه انجام های

توسط شدهجستجوی

ترتیبی

تعداد های مقایسه

شده انجامتوسط

جستجوی دودویی

128 128 8

1024 1024 11

1048576 1048576 21

4294967294 4294967294 33

Page 12: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ترتیبی : 1-1الگوریتم جوی و جستVoid seqsearch ) int n

const keytype S] [ keytype x,

index& location)

location = 1; while )location <= n && S]location[ ! = x(

location;++ if )location > n (

location = 0;

Page 13: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

دودویی :1-5الگوریتم جوی و جست

Void binsearch )int n, const keytype S,] [

keytype x, index& location)

index low, high, mid;

low = 1 ; high = n; location = 0;

while )low <= high && location = = 0( mid = Į)low + high(/2;⌡

Page 14: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if ) x = = S ]mid[( location = mid;

else if )x < S ]mid[( high = mid – 1;

else low = mid + 1;

Page 15: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

فیبوناچی nجمله : 1-6الگوریتم ام) بازگشتی)

.nجمله مسئله : کنید تعیین را فیبوناچی دنباله از ام

int fib )int n(

if ) n <= 1( return n;

else return fib )n – 1( + fib )n – 2(;

Page 16: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

(n جمله:1-7الگوریتم تکراری ) فیبوناچی ام int fib2 )int n(

index i;

int f ]0..n[; f]0[ = 0;

if )n > 0( f]1[ = 1;

for )i = 2 ; I <= n; i++( f]i[ = f ]i -1[ + f ]i -2[;

return f]n[;

Page 17: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ها 3-1 الگوریتم تحلیل باید را الگوریتم یک کارایی میزان تعیین برای

. کرد تحلیل

زمانی 1-3-1 پیچیدگی تحلیل تعیین ، الگوریتم یک زمانی پیچیدگی تحلیل

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

Page 18: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

T(n) حالت در الگوریتم زمانی پیچیدگی را. گویند می معمول

W(n) بدترین در زمانی پیچیدگی تحلیل راحالت

نامند .میA(n) میانگین حالت در زمانی پیچیدگی را

. گویند می

Page 19: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

برای معمول حالت برای زمانی پیچیدگی تحلیل) عناصرآرایه) کردن جمع الگوریتم

: اصلی به عمل آرایه از عنصر یک .sumافزودن: ورودی .n اندازه آرایه عناصر تعداد ،

T)n( = n

Page 20: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

برای معمول حالت برای زمانی پیچیدگی تحلیل) تعویضی) سازی مرتب الگوریتم

: اصلی .]i[Sبا ]S ]jمقایسه عمل

: ورودی . اندازه شوند مرتب باید که عناصری تعداد

T)n( = n)n -1( /2

Page 21: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

برای حالت دربدترین زمانی پیچیدگی تحلیل) ترتیبی) جوی و جست الگوریتم

: اصلی با عمل آرایه عنصر یک .xمقایسه: ورودی .n, اندازه آرایه در موجود عناصر تعداد

W )n( = n

Page 22: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

برای حالت بهترین در زمانی پیچیدگی تحلیل) ترتیبی) وجوی جست الگوریتم

: اصلی با عمل آرایه عنصر یک .xمقایسه: ورودی .n, اندازه آرایه عناصر تعداد

B )n( = 1

Page 23: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم 4-1 مرتبه

ازقبیل زمانی پیچیدگی با یی ها nالگوریتم100nو

. گویند می خطی زمانی های الگوریتم را

توابع با که را پیچیدگی توابع کامل مجموعهباشند، بندی دسته قابل محض دوم )n²درجه

) θ . گویند می

Page 24: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

درجه توابع با که پیچیدگی ازتوابع ای مجموعهباشند، بندی دسته قابل محض n³( ) θسوم

. شوند می نامیده

زیر در متداول پیچیدگی های گروه از برخی: است شده داده

θ)lg n( < θ )n( < θ )n lg n( < θ )n²( < θ )n³( < θ )2 ⁿ(

Page 25: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

با 2-4-1 بیشتر ها آشنایی الگوریتم مرتبه

مفروض پیچیدگی تابع یک ƒ)n( ،O )ƒ )n( ”Oبرایبزرگ“

پیچیدگی توابع از ای برای g (n)مجموعه که استمثبت حقیقی ثابت یک ها صحیح cآن عدد یZک و

منفی همه Nغیر ازای به که قسمی به دارد وجود:N =< nی داریم

g )n( >= c × ƒ )n(

Page 26: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مفروض پیچیدگی تابع یک ، )ƒ)nبرای )Ω )ƒ)n( پیچیدگی توابع از ای که g (n)مجموعه است

مثبت حقیقی ثابت عدد یک ها آن عدد cبرای یک ومنفی غیر به Nصحیح که قسمی به دارد وجود

ی همه :N =< nازای داریم g )n( =< c × ƒ )n(

Page 27: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مفروض پیچیدگی تابع یک :)ƒ)nبرای داریم ، θ )ƒ)n(( = O )ƒ)n(( ∩ Ω )ƒ)n((

پZیچیدگی ))θ)ƒ)nیعنی توابع از ای g (n)مجموعهمثبت حقیقی های ثابت ها آن برای که و dو cاست

منفی غیر صحیح که :Nعدد قسمی به دارد وجودc × ƒ )n( <= d × ƒ)n(

Page 28: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

پیچیدگی تابع یک n( ”o(ƒ(o) مفروض، )ƒ)nبرایپیچیدگی” توابع کلیه ازمجموعه عبارت )g )nکوچک

ازای : به سازند می برآورده را شرط ایZن که استمثبت حقیقی منفی cهرثابت غیر صحیح عدد ،یک

N ازای به که قسمی به دارد وجودی :N =< nهمه داریZم

g )n( =< c × ƒ )n(

Page 29: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مرتبه های ویژگی

1- O )ƒ)n(( Є g )n(. اگر ƒ )n( Є Ωاگروفقط)g)n((

2- (ƒ)n( )θ Є g )n( اگر ƒ )n( Є θ )gاگروفقط)n((.

:a > 1و b >1اگر -3 صورت آن در ،log ⁿa Є θ )log ⁿb(

:b > a > 0اگر - 4 صورت آن ،درaⁿ Є o )bⁿ(

Page 30: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مقادیر -5 ی همه ازای داریم :a > 0به

aⁿ Є o )n!(

c >= 0اگر -6 ، d >0 ، g )n( Є o )ƒ)n(( وh)n( Є θ)ƒ)n((: صورت درآن باشد،

c × g)n( + d × h )n( Є θ )ƒ)n((

Page 31: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

در -7 را زیر پیچیدگی های دسته ترتیبنظربگیرید:

θ )lg n( θ )n( θ)n lg n( θ)n²( θ)n^j( θ )n^k( θ )aⁿ( θ )bⁿ( θ )n!(

آن در . b > a > 1و k > j > 2که تابع اگر استپیچیدگی

g )n( ی دسته چپ طرف در واقع ای دسته در)ƒ )nحاوی

: صورت آن در باشد،

g )n( Є o )ƒ)n((

Page 32: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

: دوم فصل

حل و روشتقسیم

Page 33: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

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

به رفتن با مسئله باالی سطح نمونه یک حلکوچکتر های نمونه حل آوردن بدست و جزء

. شود می حاصل

Page 34: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

: باید ، بازگشتی الگوریتم یک ریزی پی هنگاماز- 1 نمونه یک حل آوردن دست به برای راهی

نمونه چند یا یک حل ازروی نمونه یک حل روی. کنیم طراحی تر کوچک

2 ) ( به- شدن نزدیک نهایی شرایط شرط. ) کنیم) تعیین را تر کوچک های نمونه

3 ) تعیین- ) نهایی شرایط شرط حالت در را حلکنیم.

Page 35: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

( :2-1الگوریتم بازگشتی ) دودویی جوی و جست

index location ) index low, index high (

index mid; if )low > high (

return 0; else

mid = Į )low + high( /2;⌡ if )x = = S ]mid[(

return mid;

Page 36: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

else if ) x < S ]mid[( return location )low , mid – 1(;

else return location )mid + 1, high(;

Page 37: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگورHیتم برای حالت دربدترین زمانی پیچیدگی تحلیلبازگشتی دودویی جوی و جست

: اصلی .]S ]midبا xمقایسه عمل : ورودی .nاندازه آرایه عناصر تعداد ،

W )n( = W )n / 2( + 1

، n >1برای n از )W )n( = W )n / 2است 2توانی+ 1

W )1( = 1

W )n( = Į lg n ⌡+ 1 Є θ )lg n(

Page 38: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ادغامی 2-2 سازی مرتب

. است سازی مرتب با مرتبط فرآیند یک ادغام

مرتب آرایه دو ترکیب معنای به دوطرفه ادغام. است مرتب ی آرایه یک در شده

Page 39: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

می زیر مراحل شامل ادغامی سازی مرتبشود:

با- 1 یک هر آرایه، زیر دو به آرایه n/2تقسیمعنصر.

2. آن- سازی مرتب با آرایه زیر هر حلادغام ترکیب- 3 طریق از ها آرایه زیر های حل

. مرتب آرایه یک در ها آن

Page 40: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ادغامی : 2-2الگوریتم سازی مرتب

void mergsort )int n , keytype S ] [(

const int h = Į n/2 ⌡ , m = n – h; keytype U ]1...h[,V ]1..m[;

if )n >1( copy S]1[ through S]h[ to U]h[;

copy S ]h + 1[ through S]h[ to V]1[ through V]m[; mergesort)h, U(; mergesort)m,V(;

merge )h , m , U,V,S(;

Page 41: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ادغام :2-3الگوریتم

void merg ) int h , int m, const keytype U,] [ const keytype V ,] [

keytype S) ] [

index i , j , k; i = 1; j = 1 ; k = 1;

while )i <= h && j <= m( if )U ]i[ < V ]j[(

S ]k[ = U ]i[ i; + +

Page 42: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

else

S ]k[ = V ]j[; j;+ +

k;+ +

if ) i > h(

copy V ]j[ through V ]m[ to S ]k[ through S ] h + m [ else

copy U ]i[ through U ]h[ to S ]k[ through S ] h + m [

Page 43: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم برای حالت دربدترین زمانی پیچیدگی -3تحلیل2) ادغام)

: اصلی ]j[Vبا . ]U ]iمقایسهعمل

: ورودی دو mو hاندازه از یک هر در موجود عناصر ،تعداد. ورودی آرایه

W ) h , m( = h + m - 1

Page 44: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم برای حالت دربدترین زمانی پیچیدگی -2تحلیل2) ادغامی) سازی مرتب

: اصلی .عمل پذیرد می صورت درادغام که ای مقایسه : ورودی آرایه nاندازه عناصر تعداد ،S.

W )n( = W )h( + W ) m( + h + m – 1 ↓ ↓ ↓

مرتبسازی برای الزم زمان ادغام برای الزم مرتب Vزمان برای الزم زمانUسازی

از nکه n >1برای + W (n) = 2 W( n / 2) است 2توانیn -1

W (1) = 0W) n ( Є θ ) n lg n(

Page 45: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ادغامی : 2-4الگوریتم سازی (mergesort 2)2مرتب

void mergesort2 )index low, index high(

index mid; if )low < high(

mid = Į ) low + high( / 2;⌡ mergesort 2 )low, mid(;

mergesort 2 )mid +1, high(; merge2)low,mid,high(

Page 46: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

2ادغام:2-5الگوریتممرتب مسئله: ی آرایه دو شده mergesortدر که Sادغام ایجاد

اند.

void mrge2 )index low, index mid, index high(

index i, j , k; keytype U ] low..high[

i = low; j = mid +1 ; k = low; while ) i <= mid && j <= high(

if ) S ]i[ < S ]j[ ( U ]k[ = S ]i[;

i; + +

Page 47: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

else U ]k[ = S ]j[

j;++

k;++

if ) i > mid ( move S ]j[ through S ]high[ to U ]k[ through U ]high[

else move S ]i[ through S ]mid[ to U ]k[ through U ]high[

move U ]low[ through U ]high[ to S ]low[ through S ]high[

Page 48: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

حل 3-2 و روشتقسیم

زیر مراحل شامل حل و تقسیم طراحی راهبرداست:

چند- 1 یا یک به مسئله ازیک ای نمونه تقسیم. کوچکتر نمونه

2 . تر- کوچک های نمونه اگر کوچکتر نمونه هر حلنبودند، کوچک کافی قدر به تر کوچک قدر به

. کنید استفاده بازگشت از منظور این برایرا- 3 تر کوچک های نمونه حل نیاز، صورت در

. آید دست به اولیه نمونه حل تا کنید ترکیب

Page 49: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

سریع )4-2 سازی (quicksortمرتب

چگونگی از آنها ترتیب سریع، سازی مرتب در. شود می ناشی ها آرایه افراز

در محوری عنصر آز تر کوچک عناصر همهدرطرف تر، عناصربزرگ وهمه آن چپ طرف

. هستند واقع آن راست

Page 50: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بازگشتی طور به سریع، سازی مرتبتا شود می فراخوانی

افراز نیز ها آن کند، مرتب را دوآرایه از یک هرشوند می

یک با ای آرایه به تا یابد می ادامه روال واینعنصربرسیم.

. است مرتب ذاتا ای آرایه چنین

Page 51: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

سریع :2-6الگوریتم سازی مرتب

سازی مسئله: . n مرتب نزولی غیر ترتیب با کلید void quicksort )index low , index high(

index pivotpoint; if ) high > low(

partition )low , high , pivotpoint( quicksort )low , pivotpoint – 1(

quicksort )pivotpoint + 1 , high(;

Page 52: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

آرایه : 2-7الگوریتم افراز

: آرایه مسئله .Sافراز سریع سازی مرتب برای void partition )index low, index high(

index & pivotpoint)

index i , j; keytype pivotitem; pivotitem = S ]low[;

j = low for ) i = low +1 ; i <= high; i ++(

Page 53: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if ) S ]i[ < pivotitem ( j;++

exchange S ]i[ and S ]j[;

pivotpoint = j; exchange S ]low[ and S ] pivotpoint[;

Page 54: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم برای معمول حالت در زمانی پیچیدگی -7تحلیل2) افراز)

: اصلی .pivotitemبا S [i]مقایسهعمل : ورودی عناصرموجود n = high – how +1اندازه تعداد ،

. آرایه زیر در

T)n( = n - 1

Page 55: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم برای حالت بدترین در زمانی پیچیدگی -6تحلیل2) سریع) سازی مرتب

: اصلی روال pivotitemبا S [i]مقایسهعمل .partitionدر : ورودی درآرایه nاندازه موجود عناصر تعداد ،S. T)n( = T)0( + T) n – 1( + n – 1

↓ ↓ ↓ افراز برای الزم سازی زمان مرتب برای الزم زمان زمان

سازی مرتب برای الزمراست طرف طرفچپ زیرآرایه آرایه زیر

Page 56: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ازای n > 0 T )n( = T )n – 1( + n – 1به T )0( = 0

W )n( = n )n – 1( / 2 Є θ )n²(

Page 57: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم برای میانگین حالت در زمانی پیچیدگی تحلیل6-2) سریع) سازی مرتب

: اصلی .partitionدر pivotitemبا S [i]مقایسهعمل : ورودی در nاندازه موجود عناصر تعداد ،S.

A )n( Є θ )n lg n(

Page 58: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ماتریساستراسن 5-2 ضرب الگوریتم

و جمع ضرب، لحاظ از الگوریتم این پیچیدگی. است سوم درجه پیچیدگی از بهتر تفریق

های ماتریس ضرب مورد در استراسن روش2×2. ندارد چندانی ارزش

Page 59: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

استراسن :2-8الگوریتم

ماتریس مسئله : دو حاصلضرب آن n ×nتعیین در nکهاز .2توانی است

void starssen ) int n n × n _ matrix A, n × n _ matrix B,

n × n _ matrix & C)

if ) n <= threshold( compute C = A × B using the standard algorithm;

Page 60: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

else

partition A into four submatrics A11, A12 , A21,A22; partition B into four submatrics B11, B12 , B21,B22;

compute C = A × B using Starssen’s Method;

Page 61: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم در ها ضرب تعداد زمانی پیچیدگی -8تحلیل2 ) معمول) حالت در استرسن

: اصلی .عمل ساده ضرب یک: ورودی .nاندازه Zماتریس در ها ستون و سطرها تعداد ،

ازای از nکه n > 1به / T )n( = 7 T )nاست 2توانی2(

T )1( = 1

T )n( Є θ ) n ^2.81(

Page 62: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تفریقهای هاو تعدادجمع زمانی پیچیدگی تحلیل ) معمول ) درحالت استرسن الگوریتم

: اصلی .عمل ساده تفریق یا جمع یک: ورودی .nاندازه Zماتریس در ها ستون و سطرها تعداد ،

ازای از nکه n > 1به = )² +)T )n(n/2 )18است2توانی7T)n/2

T ) 1 ( = 1

T ) n ( Є θ ) n ^ 2.81(

Page 63: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بزرگ : 2-9الگوریتم صحیح اعداد ضرب

بزرگ مسئله: صحیح عدد دو vو u ضرب

large _ integer prod ) large_integer u, large_integer v(

large_inreger x , y , w , z; int n , m;

n = maximum)number of digits in u,number of digits in v( if )u = = 0 || v = = 0(

return 0;

Page 64: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

else if )n < = threshold) return u × v obtained in the usual way;

else m = Į n / 2;⌡

x = u divide 10 ^ m ; y = rem 10 ^ m;

w = v divide 10 ^ m ; z = rem 10 ^ m;

return prod )x ,w( × 10 ^2m + ) prod ) x, z( + prod )w, y (( × 10 ^ m + prod ) y, z(;

Page 65: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

لگوریتم ا برای حالت بدترین در زمانی پیچیدگی -9تحلیل2) صحیح) اعداد ضرب

: اصلی صحیح عمل عدد یک در دهدهی رقم یک دستکاریدر بزرگ

اعمال انجام یا کردن، تفریق ، کردن جمع divide 10هنگام^ m ،

rem 10 ^m 10×یا ^ m .یک را هر اعمال این انجام mاز بار. دهد می

: ورودی . nاندازه صحیح عدد دو از یک هر ارقام تعداد ،

ازای از nکه n > sبه + )W ) n ( = 4 W )n / 2است2توانیcn

W ) s ( = 0

W ( n ) Є θ ( n² )

Page 66: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بزرگ :2-10الگوریتم صحیح اعداد 2ضرب

large_integer prod2 )large_integer u , large_ integer v(

large_integer x , y , w , z , r , p , q; int n , m;

n = maximum )number of digits in u,number of digits in v(; if )u = = 0 || v = = 0(

return 0;

else if )n < = threshold) return u × v obtained in the usual way ;

Page 67: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

else m = Į n / 2;⌡

x = u divide 10 ^ m ; y = rem 10 ^ m ;

w = v divide 10 ^ m ; z = rem 10 ^ m;

r = prod2 )x + y, w + z (; p = prod2 ) x , w ( q = prod2 ) y , z (;

return p ×10 ^ 2m + ) r – p – q ( × 10 ^ m +q ;

Page 68: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم برای حالت بدترین در زمانی پیچیدگی ) 2-10تحلیلصHحیح اعداد (2ضرب

: اصلی صحیح عمل عدد یک در دهدهی رقم یک دستکاریدر بزرگ

اعمال انجام یا کردن، تفریق ، کردن جمع divide 10هنگام^ m ،

rem 10 ^m 10×یا ^ m .یک را هر اعمال این انجام mاز بار. دهد می

: ورودی . nاندازه صحیح عدد دو از یک هر ارقام تعداد ،

ازای از nکه n > sبه است2توانی3W)n/2(+ c n <=W )n( <= 3W )n / 2 +1( + c n

W )s( = 0

W (n) = θ (n ^ 1.58)

Page 69: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

: سوم فصل

پویا نویسی برنامه

Page 70: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

به نمونه که لحاظ این از پویا، نویسی برنامهمشابه ، شود می تقسیم کوچکتر های نمونه ، روش این در ولی است حل و تقسیم روش

، کنیم می حل را تر کوچک های نمونه نخستاز یکی به گاه هر بعدا و کنیم می ذخیره را نتایج

دوباره محاسبه جای به شد، پیدا نیاز ها آن. کنیم بازیابی را آن است کافی

Page 71: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

به پویا نویسی برنامه الگوریتم یک بسط مراحل: است زیر شرح

ای- 1 نمونه حل برای بازگشتی ویژگی یک ارائهمسئله . از

با- 2 کل به جزء شیوه به مسئله از ای نمونه حل. تر کوچک های نمونه حل

Page 72: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

از :1-3الگوریتم استفاده با ای جمله دو ضریبحل و تقسیم

int bin ) int n , int k(

if ) k == 0 || n ==k ( return 1;

else return bin )n – 1 , k -1 ( + bin ) n-1 , k(;

Page 73: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

از :3-2الگوریتم استفاده با ای جمله دو ضریبپویا نویسی برنامه int bin2 ) int n , int k (

index i , j;

int B ]0..n[]0..k[ for ) i = 0; i ≤ n ; i ++(

if ) j == 0 || j == i ( B ]i[ ]j[ = 1;

else B ]i[ ]j[ = B ] i – 1 [ ] j -1 [ + B ] i -1 [ ]j[;

return B]n[ ]k[:

Page 74: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

کوتاه :3-3الگوریتم یافتن برای فلوید الگوریتممسیر ترین

void floyd ) int n const number W,][][

number D,][][

index i , j , k; D = W;

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

D ]i[ ]j[ = minimum ) D ]i[]j[, D]i[]k[ + D]k[]j[(;

Page 75: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

لگوریتم ا برای حالت بدترین در زمانی پیچیدگی -3تحلیل3

) مسیر) کوتاهترین یافتن برای فلوید الگوریتم

: اصلی حلقه عمل در موجود .forدستورهای: ورودی .nاندازه گراف رئوس تعداد ،

T )n( = n × n × n = n³ Є θ )n³(

Page 76: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

یافتن :3-4الگوریتم برای فلوید الگوریتممسیر 2کوتاهترین

void floyd2 ) int n, const number W,][][

number D,][][ index P)][][

index i , j , k;

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

Page 77: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

P ]i[ ]j[ = 0 ; D = W;

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

for ) j = 1 ; j <= n ; j ++( if ) D ]i[ ]k[ + D ]k[ ]j[ < D ]i[ ]j[ (

P ]i[ ]j[ = k; D ]i[ ]j[ = D ]i[ ]k[ + D ]k[ ]j[;

Page 78: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مسیر چاپ:3-5الگوریتم کوتاهترین

دیگر مسئله: راس به راسی از مسیر ترین کوتاه روی واسطه رئوس چاپ. موزون گراف یک در

void path ) index q , r(

if )P ]q[ ]r[ != 0 ( path )q , P ]q[ ]r[ (;

cout << “v” << P ]q[ ]r[; path )P ]q[ ]r[ , r (;

Page 79: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بهینه 3-3 مسائل و پویا نویسی برنامهسازی

الگوریتم یک بسط از مرحله سومین ، بهینه حلسازی بهینه مسائل برای پویا نویسی برنامه

شرح. به الگوریتمی چنین بسط مراحل است: است زیر

Page 80: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ی- 1 بهینه حل که بازگشتی ویژگی یک ارائه. دهد می دست به را مسئله از ای نمونه

به- 2 جزء ی شیوه به بهینه حل مقدار محاسبهکل.

به- 3 Zجزء ی شیوه به نمونه حل یک کردن بناکل.

Page 81: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

استفاده با توان نمی را سازی بهینه مسئله هراصل باید که چرا کرد حل پویا نویسی برنامه از

. کند صدق مسئله در بهینگی

اگریک کند می صدق مسئله یک در بهینگی اصلهمواره ، مسئله از ای نمونه برای بهینه حل

ها نمونه زیر ی همه برای بهینه حل حاویباشد.

Page 82: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ماتریسها 4-3 ای زنجیره ضرب

را بهینه ترتیب که است الگوریتمی بسط هدف.nبرای کند معین ماتریس

بستگی ها ماتریس ابعاد به فقط بهینه ترتیبدارد.

بر الگوریتم nعالوه های ورودی تنها ابعاد این ،هستند.

. است نمایی صورت به حداقل الگوریتم این

Page 83: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ها :3-6الگوریتم ضرب حداقل

int minimult ) int n, const int d,][

index P) ][][

index i , j , k , diagonal; int M ]1..n[ ]1..n[;

for ) i = 1 ; i ≤ n ; i ++( M ]i[ ]i[ = 0:

Page 84: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

for )diagonal = 1; diagonal ≤ n -1 ; diagonal ++( for ) i = 1 ; i ≤ n – diagonal ; i ++(

j = i + diagonal; M]i[]j[ = minimum )M]i[]k[ + M]k +1 []j[ +

d ] i – 1[ * d ]k[ * d ]j[;) P ]i[]j[ = a value of k that gave the minimum;

return M]1[]n[;

Page 85: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

لگوریتم ا برای معمول حالت زمانی پیچیدگی -6تحلیل3) ها) ضرب حداقل

: اصلی مقدار عمل هر برای شده اجرا دستورات توان میk . برای که را ای مقایسه بگیریم نظر در اصلی عمل را

در اصلی عمل عنوان به شود، می انجام حداقل آزمون. گیریم می نظر : ورودی .nاندازه شوند ضرب باید که ها ماتریس تعداد ،

N )n -1( )n + 1( / 6 Є θ )n³(

Page 86: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بهینه :3-7الگوریتم ترتیب چاپضرب مسئله: برای بهینه ترتیب .nچاپ ماتریس

void order ) index i, index j(

if ) i == j( cout << “A” << i;

else k = P ]i[ ]j[; cout;“(“ >> order ) i , k(;

order ) k +1 , j (; cout;”)“ >>

Page 87: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بهینه 5-3 دودویی جوی و جست های درخت

از دودویی یک دودویی جوی و جست درخت ) از) که است شوند می نامیده کلید معموال که عناصر

: که قسمی به شود، می حاصل مرتب مجموعه یک

1. است- کلید یک حاوی گره هر

Page 88: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

گره- 2 یک چپ زیردرخت در موجود های کلیدگره آن کلید مساوی یا تر کوچک مفروض،

هستند.

گره- 3 یک راست درزیردرخت موجود کلیدهایگره آن کلید مساوی یا تر بزرگ مفروض،

هستند.

Page 89: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

دودویی :3-8الگوریتم جوی و درختجست

void search ) node _ pointer tree, keytype keyin,

node _ poiner & p)

bool found; p = tree;

found = false; while )! found(

Page 90: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if ) p - > key == keyin ( found = true;

else if ) keyin < p - > key ( p = p -> left;

else p = p - > right;

Page 91: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بهینه :3-9الگوریتم جوی و درختجست

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

void optsearchtree ) int n, const float p;][

float & minavg, index R)][][

index i , j , k , diagonal;

Page 92: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

float A ]1..n + 1[ ]0..n[; for ) i = 1 ; i ≤ n ; i ++(

A ]i[ ]i -1[ = 0 A ]i[ ]i[ = p ]i[;

R ]i[ ]i[ = i; R ]i[ ] i – 1 [ = 0;

A] n + 1 [ ]n[ = 0; R] n + 1 [ ]n[ = 0;

Page 93: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

for )diagonal = 1;diagonal ≤ n – 1; diagonal++( for ) i = 1; i ≤ n – diagonal ; i ++(

j = i + diagonal; A]i[]j[ = minimum)A]i[]k-1[+A]k+1[]j[(+∑pm

R]i[]j[ = a value of k that gave the minimum;

minavg = A ]1[]n[;

Page 94: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

لگوریتم ا برای معمول حالت زمانی پیچیدگی تحلیلبهینه دودویی جستجوی درخت

: اصلی از عمل مقدار هر ازای به شده اجرا دستورات

k . حداقل آزمون برای مقایسه یک شامل دستورات ایناست.

: ورودی .، n اندازه کلید تعداد

T)n( = n ) n -1( ) n + 4 ( / 6 Є θ ) n³ (

Page 95: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

جوی :3 -10الگوریتم و درختجست ساختبهینه دودویی

node _ pointer tree ) index i , j (

index k; node _ pointer p;

k = R ]i[ ]j[; if ) k == 0 (

return NULL; else

Page 96: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

p = new nodetype; p - > key = key [k];

p - > left = tree (i , k – 1); p - > right = tree ( k+1 , j);

return P;

Page 97: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

برای :3-11الگوریتم پویا نویسی برنامه الگوریتمگرد دوره فروشنده مسئله

void tarvel ) int , n const number W, ] [] [

index P, ] [ ] [ number & minlength)

index i , j , k;

number D]1..n[]subset of V - v1 [; for ) i = 2 ; i ≤ n ; i ++(

Page 98: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

D]i[ ]Ø[ = W ]i[ ]1[;

for )k = 1 ; k ≤ n - 2 ; k ++(

for )all subsets A Ç V – v1 containing k vertices(

for )i such that i != 1 and vi is not inA(

D]i[ ]A[ = minimum ) W ]i[ ]j[ + D ]j[ ]A – vj[(;

P ]i[ ]A[ = value of j that gave the minimum;

Page 99: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

D ]1[ ] V – v1 [ = minimum ) W ]1[ ]j[ + D ]j[ ] V – v1 – v j [;)

P ]1[ ] V – v1 [ = value of j that gave the minimum;

minlength = D ]1[ ] V – v1 [;

Page 100: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ا برای معمول حالت در زمان و فضا پیچیدگی تحلیلمسئله ) 3-11لگوریتم برای پویا نویسی برنامه الگوریتم

) گرد دوره فروشنده

: اصلی در عمل ، آخر و اول ی حلقه دو هر در زمان

حلقه زیرا نیست، چشمگیر میانی حلقه در زمان با مقایسهتویی تودر گوناگون سطوح حاوی دستورات . میانی است

مقدار هر برای شده توان را v jاجرا در می اصلی عمل. گرفت نظر

ورودی : رئوس ، nاندازه . تعداد گراف در موجود

T )n( = n 2ⁿ Є θ ) n 2ⁿ (

Page 101: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

: چهارم فصل

طراحی در روشحریصانهالگوریتم

Page 102: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

، گرفته را عناصر ترتیب به ، حریصانه الگوریتممعین مالکی طبق که را عنصری آن بار هر “ به” توجه بدون رسد، می نظر به بهترین

انجام آینده در یا داده انجام قبال که هایی انتخاب. دارد می بر داد، خواهد

Page 103: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

پویا نویسی برنامه همانند ، حریصانه الگوریتممی کار به سازی بهینه مسائل حل برای غالبا

بیشتری صراحت حریصانه روش ولی روند،دارد.

کوچک های نمونه به تقسیم ، حریصانه روش در. پذیرد نمی صورت تر

Page 104: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

که انتخاب، سری یک انجام با حریصانه الگوریتممی نظر به ،بهترین خاص ای لحظه در یک هرخود جای در انتخاب یعنی کند، می عمل رسد

. بهینه حل یک که است این امید است بهینهچنین همواره ولی شود، یافت سرتاسری

نیست.

آیا که کرد تعیین باید مفروض الگوریتم یک برای. خیر یا است بهینه همواره حل

Page 105: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تهی مجموعه یک با را کار ، حریصانه الگوریتماضافه مجموعه به عناصری ترتیب به کرده آغاز

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

: است زیر های مولفه شامل ، تکرار دور هر

Page 106: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

انتخاب - 1 به روال باید که را عنصربعدی ، . انتخاب کند می شود،انتخاب اضافه مجموعه

. است حریصانه مالک یک طبقسنجی - 2 امکان که بررسی کند می تعیین ،

حل،عملی به رسیدن برای جدید مجموعه آیا . خیر یا است

حل - 3 راه آیا بررسی که کند می تعیین ،یا کند می ارائه را نمونه حل ، جدید مجموعه

خیر.

Page 107: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

کمینه 1-4 شای پو های درخت

شهر چند خواهد می شهری طراح کنید فرضکه قسمی به کند، وصل هم به جاده با را معین

. بروند دیگر شهر به شهر هر از بتوانند مردمممکن ، باشد کار در ای بودجه محدودیت اگر

مقدار حداقل با را کار این بخواهد طراح است. دهد انجام کشی جاده

: متفاوت حریصانه الگوریتم دو مسئله این برای. شود می بررسی کروسکال و پریم

Page 108: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بهینه ویژگی یک از ها الگوریتم این از یک هر. کند می استفاده محلی

حریصانه الگوریتم یک که ندارد وجود تضمینیکه شود می ثابت بدهد، بهینه حل همواره

درخت همواره پریم و کروسکال های الگوریتم. کنند می ایجاد را کمینه پوشای های

Page 109: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

پریم 1-1-4 الگوریتم

یال از تهی ای مجموعه زیر با پریم الگوریتمرئوس Fهای از ای زیرمجموعه می Yو آغاز

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

به به . Yرا س را ترین نزدیک دهیم ، Yمیدر وزن V – Yراسی با یالی توسط که است

در راسی به متصل Yکمینهاست.

Page 110: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

پریم :4-1الگوریتم الگوریتم

void prim ) int n, const number W,] [ ] [

set_ of_edges & F)

index i , vnear; number min;

edge e; index nearest ]2..n[;

Page 111: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

number distance ]2..n[; F = Ø;

for ) i = 2 ; i ≤ n ; i ++( narest ]i[ = 1;

distance ]i[ = W ]1[ ]i[;

repeat ) n-1 times ( min; ∞ =

for ) i = 2 ; i < = n ; i ++( if ) 0 ≤ distance ]i[ < min (

Page 112: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

min = distance ]i[; vnear = i;

e = edge connecting vertices indexed by

near and nearest ] vnear [ ; add e to F;

distance ] vnear [ = -1; for ) i = 2 ; i ≤ n ; i ++(

Page 113: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if ) W]i[ ] vnear [ < distance ]i[( distance ]i[ = W ]i[ ] vnear [;

nearest ]i[ = vnear;

Page 114: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

لگوریتم ا برای معمول حالت در زمانی پیچیدگی تحلیل1-4) پریم) الگوریتم

: اصلی حلقه عمل حلقه repeatدر یک دو هر که دارد وجود

(n – 1) اجرای . شود می تکرار ها بار آن از یک هر داخل دستورات

توان می را. گرفت نظر در اصل عمل اجرای بار یک عنوان به

: ورودی .nاندازه رئوس تعداد ،

T )n( = 2 ) n – 1( ) n – 1( Є θ ) n²(

Page 115: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

4-1قضیه

پوشای درخت یک همواره پریم الگوریتم. کند می تولید کمینه

مجموعه اثبات : دهیم نشان که ن آ از Fبرای پستکرارحلقه بار است repeatهر بخش امید ،

. کنیم می استفاده ازاستقرا

استقرا : مجموعه مبنای که است امید Øواضح. است بخش

Page 116: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

کروسکال :2-4الگوریتم الگوریتم

void kruskal ) int n , int m, set _ of _ edges E,

set _ of _edges & F)

index i , j; set _pointer p , q;

edge e; sort the m edges in E by weight in

Page 117: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

nondecreasing order; F = Ø;

intitial )n(; while) number of edges in F is less than n-1(

e = edge with least weight not yet considered;

i , j = indices of vertices connected by e; p = find )i(; q = find )i(;

Page 118: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if )! equal ) p, q (( merge ) p , q (;

add e to F;

Page 119: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

لگوریتم ا برای حالت بدترین در زمانی پیچیدگی تحلیل2-4) کروسکال) الگوریتم

: اصلی .عمل مقایسه دستور یکورودی : و nاندازه رئوس تعداد ،m. ها یال تعداد

: داشت نظر در باید را نکته سه الگوریتم این درباره

ها- 1 یال سازی مرتب برای الزم .زمان

W )m( Є θ ) m lg m(

Page 120: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

حلقه- 2 در .whileزمان

W )m( Є θ ) m lg m( به- 3 اولیه دهی مقدار ی برا الزم مجموعه nزمان

متمایز.

W ) m, n ( Є θ) m lg m(

: حالت بدترین ، نتیجه در

(n² lg n² = ) θ ) n²lg n ( W ) m, n ( Є θ

Page 121: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

4-2قضیه

پوشای درخت یک همواره کروسکال الگوریتم. کند می تولید کمینه

از اثبات : شروع با استقرا طریق از اثبات. شود می آغاز ها یال از تهی ای مجموعه

Page 122: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

کوتاهترین 2-4 برای دیکسترا الگوریتممبدا تک مسیر

همه به راس هر از مسیر کوتاهترین برایجهت بدون و موزون گراف یک در دیگر رئوس

) الگوریتم که θ(n²یک داریم، حریصانه روش از. دارد نام دیکسترا آن

Page 123: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

از که دهیم می ارائه فرض این با را الگوریتمدیگر، رئوس از یک هر به نظر مورد راس

. دارد وجود مسیری

مسئله برای پریم الگوریتم مشابه الگوریتم این. است کمینه پوشای درخت

Page 124: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

دیکسترا :4-3الگوریتم الگوریتم

void dijkstra ) int n, const number W,] [ ] [

set _ of _ edges & F)

index i , vnear, edge e;

index touch ]2..n[; number length]2..n[;

Page 125: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

F = Ø; for ) i = 2; i ≤ n ; i ++ (

touch ]i[ = 1; length ]i[ = W ]1[]i[;

repeat ) n – 1 times ( min; ∞ =

for ) i = 2 ; i ≤ n ; i ++( if ) 0 <= length ]i[ < min (

min = length ]i[;

Page 126: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

vnear = i;

e = edge from vertix indexed by touch ]vnear[ to vertex indexed by vnear;

add e to F; for ) i = 2 ; i ≤ n; i ++(

if ) length ]vnear[ + W ]vnear[ ]i[ < length]i[(

length ]i[ = length ]vnear[ + W ]vnear[ ]i[;

Page 127: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

touch ]i[ = vnear;

length ]vnear[ = -1;

Page 128: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

4-3قضیه

را درسیستم کل زمان که بندی زمان تنهاکه است بندی زمان کند، می سازی کمینهارائه افزایشزمان حسب بر کارها آن در

. شوند می مرتب خدمات

Page 129: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

معین :4-4الگوریتم مهلت با بندی زمان

فرض مسئله : این با ، بیشینه کل سود با بندی زمان تعیینحصول قابل وقتی فقط و است سود دارای کاری هر که

. شود انجام مقررش مهلت در کار آن که است

void schedule ) int n, const int deadline, ] [

sequence _ of _ integer& j)

index i;

Page 130: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

sequence_ of_integer K; j = ]1[;

for ) i = 2 ; i ≤ n ; i ++( K = J with i added according to nondecreasing

values of deadline ]i[; if ) K is feasible(

J = K;

Page 131: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

لگوریتم ا برای حالت بدترین در زمانی پیچیدگی تحلیلمعین مهلت با بندی زمان

: اصلی هایی عمل مقایسه کارها، سازی مرتب برای بایدکه هنگامی و پذیرد کار ) Jبا K انجام شدن افزوده از پس

i ) بیشتری های مقایسه شود،به می داده قرار مساوی امبودن پذیر امکان که هنگامی و داریم شود، Kنیاز می چک

. مقایسه اصلی عمل است نیاز بیشتری های یسه مقا بهاست.

ورودی : .nاندازه کارها تعداد ،

W )n( Є θ )n²(

Page 132: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

4-4قضیه

مهلت ) 4-4الگوریتم با بندی زمانتولید ( بهینه مجموعه یک همواره معین

. کند می

کارها، اثبات: تعداد روی استقرا ،صورت nازطریقپذیرد. می

: استقرا بر مبنای قضیه ، باشیم داشته کار یک اگرقراراست.

Page 133: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

4-5قضیه

بهینه دودویی کد یک هافمن الگوریتم. کند می تولید

. اثبات : این با گیرد می صورت استقرا ازطریقدرمرحله آمده دست به های درخت که ، iفرض

بهینه کد با متناظر دودویی درخت در هایی انشعابدر آمده بدست های درخت که دهیم می نشان اند،

دودویی i + 1مرحله )) درخت در هایی انشعاب نیز. اند بهینه کد یک با متناظر

Page 134: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

: پنجم فصل

عقبگرد راهبرد

Page 135: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

استفاده مسائلی حل برای عقبگرد تکنیک ازیک از اشیاء از ای دنباله ها آن در که شود میطوری به شود، می انتخاب مشخص مجموعه

. گیرد می بر در را کی مال ، دنباله این که

مسئله عقبگرد، از کالسیک مثال وزیر nیکاست.

Page 136: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

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

یکسان قطر یا ستون سطر، یک در نباید ایباشند.

Page 137: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

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

عمقی جوی و جست همانند عقبگرد الگوریتمفقط گره یک فرزندان که تفاوت این با است،بخش امید گره که شوند می مالقات هنگامی

. باشد نداشته وجود حلی گره آن در باشدو

Page 138: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مسئله :5-1الگوریتم برای عقبگرد nالگوریتموزیر

void queens ) index i(

index j; if ) promising)i((

if ) i == n( cout << col ]1[ through col ]n[;

else for ) j = 1 ; j ≤ n ; j++ (

Page 139: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

col ] i +1 [ = j; queens ) i + 1(;

bool promising ) index i (

index k; bool switch;

k = 1; switch = true;

Page 140: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

while ) k < i && switch ( if )col ]i[ == col]k[ || abs)col]i[ – col]k[ == i-

k( switch = false;

k;++

return switch;

Page 141: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

برای 5-3 کارلو مونت الگوریتم از استفادهیک کارایی کردن برآورد

عقبگرد الگوریتم

احتمالی ، کارلو مونت های الگوریتمطور به گاه بعدی اجرایی دستور هستند،یعنی

. شوند می تعیین تصادفی. دهد نمی رخ چیزی چنین قطعی الگوریتم در ،شدند بحث کنون تا که هایی الگوریتم ی همه

. هستند قطعی

Page 142: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

یک انتظار مورد مقدار کارلو مونت الگوریتمساده فضای یک روی که را تصادفی متغیر

آن میانگین مقدار از استفاده با ، ود می تعریفمی آورد بر ساده فضای از تصادفی نمونه روی

کند.

Page 143: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مقدار به برآورد این که ندارد وجود تضمینیانتظار مورد

آن، شدن نزدیک احتمال ولی باشد، نزدیک واقعیالگوریتم، برای دسترس در زمان افزایش با

. یابد می افزایش

Page 144: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

کارلو : 5-2الگوریتم مونت برآورد

int estimate)(

node v; int m, mprod , numnodes;

v = root of state space tree; numnodes = 1;

m = 1; mprod = 1;

Page 145: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

while ) m != 0( t = number of children of v;

mprod - mprod * m; numnodes = numnodes + mprod * t; m = number of promising children of v;

if ) m != 0( v = randomly selected promising

child of v;

return numnodes;

Page 146: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم :5-3الگوریتم برای کارلو مونت آورد برالگوریتم) 1-5

مسئله برای (nعقبگرد وزیر int ostimate _ n_ queens )int n(

index i , j , col ]1..n[;

int m , mprod , numnodes; set _of_ index prom _children;

i = 0; numnodes =1;

m = 1;

Page 147: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

mprod = 1; while ) m != 0 && i != n (

mprod = mprod * m; numnodes = numnodes + mprod * n;

i;++ m = 0;

prom_childern = Ø; for ) j = 1 ; j ≤ n ; j++;(

col ]i[ = j; if ) promising)i((

Page 148: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

m;++ prom_children = prom _ children U i;

if ) m != 0( j = random selection from prom_

children; col ]i[;

return numnodes;

Page 149: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مسئله :5-4الگوریتم برای عقبگرد الگوریتمزیر جمع حاصلها مجموعه

یک مسئله : در موجود صحیح اعداد ترکیبات ی همه تعیینها nمجموعه آن جمع حاصل که طوری به ، صحیح عدد

معین مقدار .Wمساوی شود void sum _of _subsets ) index i,

int weight , int total)

if )promising)i(( if ) weight == W (

cout << include ]1[ through include ]i[ ; else

Page 150: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

include ]i +1[ = “yes; ” sum_ of_subsets ) i +1 , weight + w ]i +1[,

total – w ] i + 1 [;)

bool promising ) index i(;

return )weight + total ≥ W( &&) weight == W|| weight + w ] i + 1 [ ≤ W;)

Page 151: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

گراف 5-5 آمیزی رنگ

آمیزی رنگ ی mمسئله همه یافتن از عبارت ،گراف یک آمیزی رنگ برای ممکن ی ها راه

حداکثر از استفاده با ، جهت رنگ mبدونراس دو هیچ که طوری به است، متفاوت

. نباشند رنگ هم مجاوری

Page 152: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

رنگ :5-5الگوریتم مسئله برای عقبگرد الگوریتمm آمیزی

void m_coloring )index i (

int color; if ) promising )i((

if ) i == n( cout << vcolor]1[ through vcolor ]n[ ;

else for )color = 1; color ≤ m; color ++(

Page 153: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

vcolor ] i + 1[ = color; m_coloring )i + 1(;

bool promising ) index i (

index j; bool switch; switch = true;

Page 154: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

j = 1 ;

while ) j < i && switch ( if ) W ]i[ ]j[ && vcolor ]i[ == vcolor]j[(

switch = false; j;++

return switch;

Page 155: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مسئله :5-6الگوریتم برای عقبگرد الگوریتمها میلتونی مدارهای

void hamiltonian ) index i (

index j; if ) promising )i(

if ) i == n - 1( cout << vindex ]0[ through vindex ] n-1[;

else for ) j = 2 ; j ≤ n ; j ++(

Page 156: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

vindex ] i +1[ = j; hamiltonian ) i +1 (;

bool promising ) index i (

index j; bool switch;

if) i == n -1 &&! W ]vindex ] n-1 [[ ] vindex ]0[[( switch = false ;

Page 157: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

else switch = true;

j = 1;while ) j < i && switch (

if )vindex ]i[ == vindex ]j[( switch = false;

j;++

return switch;

Page 158: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

یک 5-7 و صفر پشتی کوله مسئله

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

. هستند مثبتی اعداد ها ارزش و اوزان

Page 159: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

درون دزدد می که قطعاتی دارد درنظر دزدیکل وزن اگر و دهد قرار پشتی کوله یک

از پشتی کوله آن در شده داده قرار قطعاتمثبت صحیح عدد رود، Wیک فراتر

شود می پاره پشتی .کوله

Page 160: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

کوله :5-7الگوریتم مسئله برای عقبگرد الگوریتمیک و صفر پشتی

void knapsack ) index i, int profit , int weight)

if ) weight ≤ W && profit > maxprofit (

maxprofit = profit; numbest = i;

bestset = include;

if ) promising )i((

Page 161: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

include ] i + 1 [ = “yes;” knapsack ) i + 1, profit + p ] i + 1[ , weight+

w ] i +1 [;) include ] i +1[ = “ no;”

knapsachk ) i +1 , profit , weight (;

bool promising ) index i (

index j , k;

Page 162: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

int totweight; float bound;

if ) weight ≥ W( return false;

j = i +1;

bound = profit; totweight = weight;

while ) j <= n && totweight + w]j[ <= W( totweight = totweight + W ]j[;

Page 163: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

bound = bound + p]j[; j;++

k = j;

if ) k <= n( bound = bound + )W – totweight( * p ]k[/w]k[;

return bound > max profit;

Page 164: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

پویا 2-5-7 نویسی برنامه الگوریتم مقایسهکوله مسئله برای عقبگرد الگوریتم و

یک و صفر پشتی

برنامه الگوریتم توسط که عناصری تعدادیک و صفر پشتی کوله مسئله برای پویا نویسی

به حالت دربدترین شود می Oمحاسبه(minimum (2ⁿ , nW)). دارد تعلق

( عقبگرد الگوریتم ، حالت بدترین گره ⁿ 2)θدر. کند می چک را

Page 165: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

نسبت بیشتری کارایی معموال عقبگرد الگوریتم. دارد پویا نویسی برنامه الگوریتم به

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

یک و صفر پشتی کوله مسئله برای الگوریتمیبه حالت دربدترین که اند داده O(2^n/2)بسط

. دارد تعلق

Page 166: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

: ششم فصل

حد و شاخه راهبرد

Page 167: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

شبا عقبگرد به لحاظ ازآن حد و شاخه راهبردکه دارد هت

حالت فضای درخت از مسئله حل بریا درآن،. شود می استفاده

به را ما اوال عقبگرد، با روش این تفاوتکندوثانیا نمی محدود ازدرخت خاصی پیمایش. رود می کار به سازی بهینه مسائل برای فقط

Page 168: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

را عددی گره هر در ، حد و شاخه الگوریتمآیا) ( که شود تاتعیین کند می رامحاسبه حدی

. خیر یا هست بخش امید گره این

تاکنون که حلی بهترین مقدار از بهتر حد آن اگر . است بخش امید غیر گره نباشد، ، شده یافته

. است بخش امید ، صورت این غیر در

Page 169: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

گره حدود توان می حد، از براستفاده عالوهفرزندان و کرد مقایسه را بخش امید های

. ترتیب بدین نمود مالقات را حد بهترین با گرهییک در را ها گره که آن از تر سریع توان می

حل به کرد، مالحظه شده تعیین پیش از ترتیب . یافت دست بهینه

Page 170: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

هرس با جو و جست بهترین را روش این. گویند می حد و شاخه کردن

ی شده اصالح شکل روش، این سازی پیادهجست به موسوم دیگر روش یک از ای ساده

. است حد و شاخه کردن هرس عرضی جوی و

Page 171: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

با : 6-1الگوریتم عرضی جوی و جست الگوریتمشاخه هرسکردن

یک و صفر پشتی کوله مسئله برای حد و

void knapsack ) int n, const int p ] [ , const int w,] [

int W, int & maxprofit)

queue _of _ node Q;

node u , v; intialize )Q(;

Page 172: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

v.level = 0 ; v.profit = 0 ; v.weight = 0; maxprofit = 0;

enqueue )Q , v(; while )!empty )Q((

dequeue ) Q , v (; u.level = v.level + 1;

u.weight = v. weight + w ] u.level[; u. profit = v.profit + p ] u.level[;

if ) u.weight <= W && u.profit > maxprofit( maxprofit = u.profit ;

Page 173: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if ) bound )u( > maxprofit ( enqueue )Q, u(;

u.weight = v. weight; u. profit = v.profit;

if ) bound )u( > maxprofit ( enqueue )Q , u(;

float bound ) node u(

Page 174: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

index j, k; int totweight; float result;

if ) u.weight >= W( return 0;

else result = u.profit;

j = u.level + 1; totweight = u.weight;

while) j <= n && totweight +w ]j[ <= W(

Page 175: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

totweight = totweight + w ]j[; result = result + p ]j[;

j;++

k = j; if ) k <= n (

result = result +) W – totweight ( * p ]k[ / w ]k[; return result;

Page 176: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

هرسکردن :6-2الگوریتم با جو و جست بهترینیک و صفر پشتی کوله مسئله برای حد و شاخه

void knapsack ) int n, const int p ] [ , const int w,] [

int W, int & maxproit)

priority _ queue_of _node PQ;

node u , v; initialize )PQ(;

Page 177: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

v.level = 0 ; v.profit = 0 ; v.weight = 0; maxprofit = 0;

v.bound = bound )v(; insert )PQ , v(;

while )! Empty)PQ(( remove )PQ , v(;

if) v.bound > maxprofit ( u.level = v.level + 1;

u.weight = v.weight + w ] u.level [; u. profit = v.profit + p ] u.level [;

Page 178: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if ) u.weight <= W && u.profit > maxprofit ( maxprofit = u.profit;

u.bound = bound )u(; if ) u.bound > maxprofit (

insert )PQ , u(; u.weight = v.weight;

u. profit = v.profit; u.bound = bound )u(;

if ) u.bound > maxprofit ( insert )PQ <u (;

Page 179: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

گرد 2-6 دوره فروشنده مسئله

در مسیر کوتاهترین یافتن مسئله این از هدفراس یک از شروع با دار جهت گراف یک

راس هر که آن بر مشروط ، است مفروض . یک را مسیری چنین شود مالقات ر با یک فقط

. گویند می تور

Page 180: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

هرس :6-3الگوریتم با جستجو بهترین الگوریتمدوره فروشنده مسئله برای حد و شاخه کردن

گرد void travel2 ) int n,

const number W, ] [ ] [ ordered-set & opttour,

number & minlength)

priority _ queue _ of _ node PQ; node u , v;

initialize ) PQ (;

Page 181: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

v.level = 0; v.path = ]1[;

v.bound = bound )v(; minlength; ∞ = insert )PQ , v (;

while ) ! Empty )PQ(( remove) PQ, v (;

if ) v.bound < minlength ( u.level = v.level + 1;

Page 182: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

for )all i such that 2 ≤ i ≤ n && i is not in v.path( u.path = v.path;

put i at the end of u.path; if ) u.level == n – 2 ( put index of only vertex

put in u.path at the end of path; put 1 at the end of u.path;

if ) length )u( < minlength ( minlength = length )u(;

Page 183: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

opttour = u.path;

else u.bound = bound )u(;

if ) u.bound < minlength ( insert )PQ , u (;

Page 184: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بیماری ) (2-3 تشخیص ای فرضیه استنباط

سیستم و مصنوعی رهوش د مهم مسئله یکبرای توضیح ترین محتمل تعیین خبره، های

. است ها فته یا برخی

محتمل خواهیم می پزشکی در مثال، ی براسری یک از که را ها بیماری از مجموعه ترین

. کنیم تعیین ، است گیری نتیجه قابل عالئم

Page 185: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

یک برای توضیح ترین محتمل تعیین فرایندرا ها یافته طریق مجموعه از استنباط

.فرضیه میم نا می

باور دادن شبکه نشان برای استانداردیو بیماری میان روابط نظیر ، احتمالی روابط

. رود می شمار به ها نه نشا

Page 186: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

با :6-4الگوریتم جو و جست بهترین الگوریتمفرضیه استنباط برای حد و شاخه هرسکردن

) کوپر ) الگوریتم ای

void cooper ) int n, Bayesian_network_of_n_diseases BN,

set _ of _symptoms S, set_ of _indices & best , float & pbest)

priority_queue_of_node PQ;

node u , v; v.level = 0;

Page 187: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

v.D = Ø; best = Ø;

pbest = p )Ø | S (; v.bound = bound )v(;

insert )PQ , v (; while ) ! Empty )PQ((

remove )PQ , v(; if ) v.bound > pbest (

u.level = v.level + 1; u.D = v.D ;

Page 188: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

put u.level in u.D; if ) p ) u.D | S ( > pbest(

best = u.D; pbest = p ) u.D | S (;

u.bound = bound)u(;

if ) u.bouond > pbest ( insert )PQ, u(;

u.D = v.D; u.bound = bound )u(;

if ) u.bound > pbest (

Page 189: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

insert )PQ , u (;

int bound ) node u (

if )u.level == n ( return 0;

else return p)u.D | p )S(;

Page 190: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

: هفتم فصل

: محاسباتی پیچیدگی بر ای مقدمهسازی مرتب مسئله

Page 191: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

محاسباتی 7- 1 پیچیدگی

تمام مطالعه از عبارت محاسباتی پیچیدگیمسئله یک حل برای پذیر امکن الگوهای

. است مفروض

کنیم می کوشش محاسباتی پیچیدگی تحلیل دربرای را ها الگوریتم ی همه کارایی پایینی حد تا

. آوریم دست به مفروض مسئله یک

Page 192: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

محاسباتی تحلیل مسئله پیچیدگی مطالعه با راسازی مرتب

. کنیم می معرفی: دارد دلیل دو انتخاب اینرا- 1 مسئله که که اند شده ابداع الگوریتم چند

. کنند می حل

مسائلی- 2 معدود از یکی سازی مرتب مسئلهپیچیدگی با هایی الگوریتم بسط در که است

بوده موفق آن برای پایینی حد به نزدیک زمانیایم.

Page 193: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

سازی 2-7 مرتب و درجی سازی مرتبانتخابی

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

Page 194: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

درجی :7-1الگوریتم سازی مرتب

void insertionsort ) int n , keytype S] [ (

index i , j; keytype x;

for ) i = 2 ; i <= n ; i ++( x = S ]i[; j = i + 1;

Page 195: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

while ) j >0 && S ]i[ > x (

S ] j + 1 [ = S ]j[; j; - -

S ] j + 1 [ = x;

Page 196: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

درا ها کلید های مقایسه تعداد زمانی پیچیدگی تحلیلدرجی سازی مرتب لگوریتم

حالت بدترین در

اصلی : .xبا ]S ] jمقایسه عملورودی : مرتب n اندازه باید که هایی کلید تعداد ،

شوند.

W )n( = n) n - 1( / 2

Page 197: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

درا ها کلید های مقایسه تعداد زمانی پیچیدگی تحلیلدرجی سازی مرتب لگوریتم

میانگین حالت در

اصلی : .xبا ]S ] jمقایسه عملورودی : مرتب n اندازه باید که هایی کلید تعداد ،

شوند.

A )n( = n² / 4

Page 198: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم برای اضافی فضای از استفاده ) 7-1تحلیل) درجی سازی مرتب

با که فضایی ی nتنها اندازه یابد، می افزایشورودی . Sآرایه یک الگوریتم ،این پس است

( به اضافی فضای و است درجا سازی ( 1مرتبθ. دارد تعلق

Page 199: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

درجی : 7- 1جدول ، تعویضی سازی مرتب تحلیل خالصهانتخابی و

الگوریتم

مقایسه کلید

رکورد انتسابها

استفاده ازفضایاضافی

تعویضی

T (n) = n² / 2 W )n( = 3 n²/ 2 A )n( = 3 n²/ 2 درجا

درجیW(n) = n² / 2 A (n) = n² / 4

W (n) = n² / 2A (n) = n² / 4 درجا

انتخابی

T (n) = n² / 2 T (n)= 3nدرجا

Page 200: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

انتخابی :7-2الگوریتم سازی مرتب

void selectionsort ) int n , keytype S ] [ (

index i , j , smallest; for ) i = 1; i <= n-1 ; i ++ (

if ) S ]j[ < S ] smallest[( smallest = j;

exchange S ]i[ and S ]smsllest [;

Page 201: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

7-1قضیه

که الگوریتمی از nهر فقط را متمایز کلیدهر از پس و دهد انجام ها کلید مقایسه طریق

حذف را وارونگی یک اکثر حد ، مقایسه بارحداقل حالت بدترین در باید کنید،

n( n- 1) /4. دهد انجام ها کلید روی مقایسه

Page 202: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تعویضی سازی مرتب الگوریتم

void exchangesort ) int n , keytype S ] [ (

index i , j; for ) i = 1 ; i <= n -1 ; i ++ (

if ) S ]j[ < S ]i[ ( exchange S ]i[ and S ]j[;

Page 203: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ادغامی 4-7 سازی مرتب به دوباره نگاهی

در ها کلید های مقایسه تعداد زمانی پیچیدگیکه وقتی حالت، بدترین در ادغامی سازی مرتب

n از به 2توانی کلی طور به θ(n lg n)است،: دارد تعلق

W )n( = n lg n – ) n – 1 (

Page 204: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

در ها رکورد های مقایسه تعداد زمانی پیچیدگیبه تقریبا معمول حالت در ادغامی سازی مرتب

: است زیر صورت

T ) n( = 2n lg n

Page 205: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ادغامی سازی مرتب به بخشیدن بهبود

شیوه سه به را ادغZامی سازی مرتب توانیم می: ببخشیم بهبود

روش- 1 به ادغZامی سازی ازمرتب ای نسخهپویا نویسی برنامه

پیوندی- 2 نسخهتر- 3 پیچیده ادغامی الگوریتم

Page 206: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ادغامی: 7-3الگوریتم سازی نسخه ) 3مرتب) پویا نویسی برنامه

void mergesort ) int n , keytype S ] [ (

int m; index low , mid , high , size;

m = 2 ^ ] lg n[; size = 1;

repeat )lgm times ( for ) low = 1; low <= m -2 * size + 1;

low = low + 2 * size )

Page 207: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

mid = low + size -1; high = minimun ) low + 2 * size – 1 , n (;

merge3 ) low , mid , high , S (;

size = 2 * size;

Page 208: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

ادغامی :7-4الگوریتم سازی نسخه ) 4مرتبپیوندی(

void mergesort4)int low,indexhigh, index&mergedlist(

index mid , list 1 , list 2;

if ) low == high ( mergedlist = low;

S ] mergedlist [.link = 0;

else

Page 209: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

mid = Į )low + high ( / 2;⌡ mergesort4 ) low , mid , list1 ( ;

mergesort4 ) mid + 1, high , list 2( ; mergesort4 ) list1 , list 2, mergedlist (;

void merge4)index list1,indexlist2,index& mergedlist(

index lastsorted;

Page 210: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if S ] list 1[.key < S ]list 2 [ .key mergedlist = list1;

list1 = S ]list 2 [.link ;

else mergedlist = list 2;

list 2 = S ]list 2 [ .link;

lastsorted = mergedlist;

Page 211: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

while ) list1 != 0 && list2 != 0 ( if S ]list 1[.key < S ]list 2[.key

S ] lastsorted [.link = list 1; lastsorted = list1;

list 1 = S ] list 1[ .link;

else S ] lastsorted [.link = list 2;

lastsorted = list2;

Page 212: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

list 2 = S ] list 2[ .link;

if ) list 1 ==0( S ] lastsorted [.link = list 2;

else S ] lastsorted [ .link = list 1;

Page 213: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

الگوریتم برای اضافی فضای از استفاده -4تحلیل7 (Hادغامی سازی (4مرتب

به اضافی فضای از استفاده حالت هر θ( n)در. دارد تعلق پیوند

از ها θ( n)منظور پیوند تعداد که است پیونداین θ( n)به

. دارد تعلق

Page 214: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

سریع 5-7 سازی مرتب به دوباره نگاهی

void quicksort ) index low , index high (

index pivotpoint; if ) high > low (

partition ) low , high , pivotpoint (; quicksort ) low , high , pivotpoint – 1(;

quicksort )pivotpoint + 1 , high (;

Page 215: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مرتب الگوریتم به بخشیدن بهبود روشهایسریع سازی

سازی مرتب در اضافی فضای از استفاده: داد کاهش شیوه پنج به توان می را سریع

روال- 1 زیر quicksort در کدام کنیم می تعیین ،پشته در را آن همواره و تراست کوچک آرایه

. داریم می نگه را دیگری و دهیم می قرار

Page 216: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

بد در اضافی فضای از استفاده نسخه این دربه حالت .θ( lg n )ترین دارد تعلق اندیس

از- 2 ای تعداد partitionنسخه که دارد وجودچشمگیر طرزی به را ها رکورد های انتساب

. دهد می کاهش

Page 217: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تعداد زمانی پیچیدگی نسخه، این برایسازی مرتب توسط شده انجام های انتساب

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

A (n) = 0.69 ( n + 1 ) lg n

Page 218: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

اعمال- 3 از زیادی مورد pushو popمقدار بیاست.

نوشتن با توانیم تکرار quicksortمی شیوه بهو

بیهوده ازعملیات روال، در پشته دستکاریکنیم، پرهیز

، بازگشتی و پشته از استفاده جای به یعنیرا پشته

. سازیم می خودمان

Page 219: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

سازی- 4 مرتب مثل بازگشتی های الگوریتمکه آستانه مقدار یک تعیین با توان می را سریع

، نمونه بیشتر تقسیم جای به الگوریتم آن در ، کند می فراخوانی را تکراری الگوریتم یک

. بخشید بهبود

Page 220: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

میانه- 5 ، S [low]انتخاب S [ Į low + high )/2 ⌡، S [high]. است محوری ی نقطه برای

Page 221: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

سازی 6-7 heapمرتب

است دودویی درخت یک کامل دودویی درخت: باشد زیر شرایط واجد که

. باشند داشته فرزند دو داخلی های گره ی همه عمق رای دا ها برگ ی .dهمه باشند

Page 222: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

دودویی درخت یک کامل اساسا دودویی درخت: که است

عمق .n – 1 )تا باشد( کامل دودویی درخت یک عمق با هایی طرف dگره در امکان حد تا

. شوند واقع چپ

Page 223: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

heap به است کامل اساس دودویی درخت یک: که طوری

یک از آن های گره در شده نگهداری مقادیر. باشند مرتب مجموعه

یا تر بزرگ گره درهر شده نگهداری مقادیرآن فرزندان در شده نگهداری مقادیر مساوی

باشد.

Page 224: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

سازی 2-6-7 مرتب سازی heapپیاده

های داده heap ساختمان struct heap

keytype S ]1..n[;

int heapsize; ;

void siftdown ) heap& H , index i (

Page 225: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

index parent, largerchild; keytype siftkey; bool spotfound; siftkey = H.S[i];

parent = i ; spotfound = false; while (2* parent <= H.hepsize &&! spotfound)

if ( 2 * parent < H.heapsize && H.S [ 2*parent] largerchild = 2 * parent + 1;

else largerchild = 2 * parent;

Page 226: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

if ( siftkey < H.S[largerchild ]) H.S [parent] = H.S[largerchild ];

parent = largerhild;

else spotfound = true;

H.S[parent] = siftkey;

Page 227: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

keytype keyout; keyout = H.S ]1[;

H.S]1[ = H.S]heapsize[; H.heapsize = H.heapsize -1;

siftdown )H , 1 (; return keyout ;

void removekeys ) int n,

heap& H keytype S) ] [

Page 228: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

index i;

for ) i = n; i >= 1 ; i --( S ]i[ = root )H(;

void makeheap ) int n,

heap& H)

index i; H.heapsize = n;

Page 229: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

for ) i = Į n/2⌡; i >= 1 ; i --(

siftdown )H,i(;

Page 230: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

سازی :7-5الگوریتم heapمرتب

void heapsort ) int n , heap& H(

makeheap ) n, H (; removekeys ) n, H , H.S (;

Page 231: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

سریع 7-7 سازی مرتب ادغامی، سازی مرتب مقایسهسازی heapومرتب

سازی مرتب بر معموال سریع سازی مرتبheap. دارد ارجحیت

سازی مرتب بر معموال سریع سازی مرتب. شود می داده ترجیح ادغامی

Page 232: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

گیری 1-8-1 تصمیم ی ها الگوهای درخت برایسازی مرتب

برای : 7-1لم قطعی الگوریتم هر با متناظرسازی تصمیم nمرتب درخت یک متمایز، کلید

و معتبر ، دودویی دقیقا گیری با شده ! nهرس. دارد وجود برگ

Page 233: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

توسط :7-2لم شده انجام های مقایسه تعدادبرابر حالت بدترین در گیری تصمیم درخت یک

. است درخت عمق با

Page 234: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

اگر: 7-3لمm درخت یک در ها برگ تعدادو dدودویی

: داریم باشد، آن عمق

d ≥ lg m

Page 235: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

7-2قضیه

که قطعی الگوریتم متمایزرا n هر کلیدسازی مرتب ها کلید مقایسه با فقطاقل حد حالت بدترین در باید کند، می

lg ) n!( . دهد راانجام ها کلید مقایسه

Page 236: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

صحیح :7-4لم و مثبت عدد هر ازای ، nبهداریم:

lg )n!( ≥ n lg n – 1.45 n

Page 237: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

7-3قضیه

که قطعی الگوریتم را nهر متمایز کلیدی مقایسه با فقط

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

n lg n – 1.45n را ها کلید مقایسه. دهد انجام

Page 238: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

حالت 3-8-7 در رفتار برای پایینی حدودمیانگین

گیری : 7-5لم تصمیم درخت هر با ظر متناسازی مرتب برای شده هرس معتبر nدودویی

درخت - یک متمایز، معتبر 2کلید گیری تصمیماندازه به اقل حد که دارد وجود شده هرس

. دارد کارایی اول درخت

Page 239: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

که : 7-6لم قطعی الگوریتم متمایز nهر کلیدمی سازی مرتب ها کلید مقایسه با فقط را

انجام که های کلید محاسبه تعداد اقل حد کند،: با است برابر میانگین طور به دهد می

mimEPL )n!( / n!

Page 240: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

7-7لم:- دودویی درخت دارای 2هر mکهو باشد برگ

EPL برابر ی )minEPL)mآن همه باید باشد، . باشند سطح ترین پایین در آن های برگ

Page 241: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

درخت -:7-8لم دارای 2هر و mکه Eplبرگبرابر آن

minEPL)m( باید ، سطح d – m^2باشد در برگd – 1

درسطح 2m – 2 ^dو برگ dبرگ و باد داشتهدیگری

باشد، .dنداشته است درخت عمق

Page 242: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

درخت -: 7-9لم هر ازای و mکه 2به برگEPL برابربا عمق )minEPL)mآن dباشد،

: از است عبارت

d = lg m

Page 243: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مقادیر :7-10لم ی همه ازای m ≥ 1بهداریم :

mimEPL)M( ≥ m Į lg m⌡

Page 244: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

7-4قضیه

که قطعی الگوریتم با nهر تنها متمایزرا کلیدطور به کند، سازی مرتب کلیدها مقایسهرا ها مقایسه تعداد این حداقل باید میانگین

: دهد انجام

n lg n – 1.45n⌡ Į

Page 245: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

مرتب ) 9-7 توزیع طریق از سازی مرتب) مبنایی سازی

مبنایی : 7-6الگوریتم سازی مرتب

void radixsort ) node_pointer& mastrrlist ; int numdigits)

index i;

node_pointer list ]0..9[ for ) i = 1 ; i <= numdigits ; i ++(

Page 246: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

disteibute )i(; coalesce;

void distrebute ) index i (

index j; node_pointer p;

for ) j = 0 ; j <= 9 ; j++(

Page 247: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

list ]j[ = NULL; p = masterlist;

while ) p != NULL( j = value of ith digit )from the right(in p -> key;

link p to the end of list ]j[; p = p -> link;

void coalesce)(

Page 248: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

index j;

masterlist = NULL; for ) j = 0 ; j <= 9 ; j++(

link the nodes in list ]j[ to the end of masterlist;

Page 249: درس طراحی الگوریتم ها (با شبه کد های  c ++ )

تشکر با

پایان