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

Post on 24-Feb-2016

101 views 2 download

description

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

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

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

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

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

: اول فصل

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

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

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

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

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

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

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

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

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

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

ترتیبی : 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;

آرایه :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;

تعویضی مرتب: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[;

ماتریسها ضرب: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;

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

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

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

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

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

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

است .1 +

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

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

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

ترتیبی

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

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

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

128 128 8

1024 1024 11

1048576 1048576 21

4294967294 4294967294 33

ترتیبی : 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;

دودویی :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;⌡

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

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

else low = mid + 1;

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

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

int fib )int n(

if ) n <= 1( return n;

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

(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[;

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

. کرد تحلیل

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

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

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

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

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

. گویند می

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

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

T)n( = n

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

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

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

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

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

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

W )n( = n

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

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

B )n( = 1

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

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

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

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

) θ . گویند می

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

مقادیر -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((

در -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((

: دوم فصل

حل و روشتقسیم

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

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

. شود می حاصل

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

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

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

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

( :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;

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

else return location )mid + 1, high(;

الگور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(

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

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

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

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

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

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

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

ادغامی : 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(;

ادغام :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; + +

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 [

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

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

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

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

الگوریتم برای حالت دربدترین زمانی پیچیدگی -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(

ادغامی : 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(

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; + +

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[

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

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

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

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

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

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

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

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

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

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

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

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

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

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

سریع :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(;

آرایه : 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 ++(

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

exchange S ]i[ and S ]j[;

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

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

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

. آرایه زیر در

T)n( = n - 1

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

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

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

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

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

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

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

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

A )n( Є θ )n lg n(

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

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

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

استراسن :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;

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;

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

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

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

T )1( = 1

T )n( Є θ ) n ^2.81(

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

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

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

T ) 1 ( = 1

T ) n ( Є θ ) n ^ 2.81(

بزرگ : 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;

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

لگوریتم ا برای حالت بدترین در زمانی پیچیدگی -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² )

بزرگ :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 ;

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 ;

الگوریتم برای حالت بدترین در زمانی پیچیدگی ) 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)

: سوم فصل

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

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

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

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

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

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

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

از :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(;

از :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[:

کوتاه :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[(;

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

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

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

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

یافتن :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++(

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[;

مسیر چاپ: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 (;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ها :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:

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[;

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

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

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

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

بهینه :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;”)“ >>

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

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

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

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

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

هستند.

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

هستند.

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

void search ) node _ pointer tree, keytype keyin,

node _ poiner & p)

bool found; p = tree;

found = false; while )! found(

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

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

else p = p - > right;

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

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

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

float & minavg, index R)][][

index i , j , k , diagonal;

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;

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[;

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

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

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

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

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

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

node _ pointer tree ) index i , j (

index k; node _ pointer p;

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

return NULL; else

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

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

return P;

برای :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 ++(

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;

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 [;

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

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

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

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

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

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

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

: چهارم فصل

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

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

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

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

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

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

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

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

نیست.

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

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

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

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

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

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

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

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

خیر.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

set_ of_edges & F)

index i , vnear; number min;

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

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 (

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

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

nearest ]i[ = vnear;

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

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

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

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

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

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

4-1قضیه

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

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

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

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

کروسکال :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

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

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

add e to F;

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

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

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

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

W )m( Є θ ) m lg m(

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

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

متمایز.

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

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

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

4-2قضیه

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

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

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

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

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

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

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

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

دیکسترا :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[;

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[;

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[;

touch ]i[ = vnear;

length ]vnear[ = -1;

4-3قضیه

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

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

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

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

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

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

sequence _ of _ integer& j)

index i;

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;

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

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

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

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

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

W )n( Є θ )n²(

4-4قضیه

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

. کند می

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

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

4-5قضیه

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

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

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

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

: پنجم فصل

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

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

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

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

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

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

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

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

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

مسئله :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++ (

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

bool promising ) index i (

index k; bool switch;

k = 1; switch = true;

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

k( switch = false;

k;++

return switch;

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

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

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

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

. هستند قطعی

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

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

کند.

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

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

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

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

int estimate)(

node v; int m, mprod , numnodes;

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

m = 1; mprod = 1;

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;

الگوریتم :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;

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

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

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

children; col ]i[;

return numnodes;

مسئله :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

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

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

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

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

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

رنگ :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 ++(

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

bool promising ) index i (

index j; bool switch; switch = true;

j = 1 ;

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

switch = false; j;++

return switch;

مسئله :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 ++(

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 ;

else switch = true;

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

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

j;++

return switch;

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

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

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

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

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

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

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

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

if ) weight ≤ W && profit > maxprofit (

maxprofit = profit; numbest = i;

bestset = include;

if ) promising )i((

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;

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[;

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

k = j;

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

return bound > max profit;

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

یک و صفر پشتی

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

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

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

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

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

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

. دارد تعلق

: ششم فصل

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

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

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

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

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

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

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

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

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

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

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

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

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

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

با : 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(;

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 ;

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(

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(

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

j;++

k = j; if ) k <= n (

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

هرسکردن :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(;

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 [;

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

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

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

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

. گویند می تور

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

گرد void travel2 ) int n,

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

number & minlength)

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

initialize ) PQ (;

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;

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

opttour = u.path;

else u.bound = bound )u(;

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

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

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

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

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

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

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

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

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

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

با :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;

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 ;

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 (

insert )PQ , u (;

int bound ) node u (

if )u.level == n ( return 0;

else return p)u.D | p )S(;

: هفتم فصل

: محاسباتی پیچیدگی بر ای مقدمهسازی مرتب مسئله

محاسباتی 7- 1 پیچیدگی

تمام مطالعه از عبارت محاسباتی پیچیدگیمسئله یک حل برای پذیر امکن الگوهای

. است مفروض

کنیم می کوشش محاسباتی پیچیدگی تحلیل دربرای را ها الگوریتم ی همه کارایی پایینی حد تا

. آوریم دست به مفروض مسئله یک

محاسباتی تحلیل مسئله پیچیدگی مطالعه با راسازی مرتب

. کنیم می معرفی: دارد دلیل دو انتخاب اینرا- 1 مسئله که که اند شده ابداع الگوریتم چند

. کنند می حل

مسائلی- 2 معدود از یکی سازی مرتب مسئلهپیچیدگی با هایی الگوریتم بسط در که است

بوده موفق آن برای پایینی حد به نزدیک زمانیایم.

سازی 2-7 مرتب و درجی سازی مرتبانتخابی

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

درجی :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;

while ) j >0 && S ]i[ > x (

S ] j + 1 [ = S ]j[; j; - -

S ] j + 1 [ = x;

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

حالت بدترین در

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

شوند.

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

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

میانگین حالت در

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

شوند.

A )n( = n² / 4

الگوریتم برای اضافی فضای از استفاده ) 7-1تحلیل) درجی سازی مرتب

با که فضایی ی nتنها اندازه یابد، می افزایشورودی . Sآرایه یک الگوریتم ،این پس است

( به اضافی فضای و است درجا سازی ( 1مرتبθ. دارد تعلق

درجی : 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درجا

انتخابی :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 [;

7-1قضیه

که الگوریتمی از nهر فقط را متمایز کلیدهر از پس و دهد انجام ها کلید مقایسه طریق

حذف را وارونگی یک اکثر حد ، مقایسه بارحداقل حالت بدترین در باید کنید،

n( n- 1) /4. دهد انجام ها کلید روی مقایسه

تعویضی سازی مرتب الگوریتم

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[;

ادغامی 4-7 سازی مرتب به دوباره نگاهی

در ها کلید های مقایسه تعداد زمانی پیچیدگیکه وقتی حالت، بدترین در ادغامی سازی مرتب

n از به 2توانی کلی طور به θ(n lg n)است،: دارد تعلق

W )n( = n lg n – ) n – 1 (

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

: است زیر صورت

T ) n( = 2n lg n

ادغامی سازی مرتب به بخشیدن بهبود

شیوه سه به را ادغZامی سازی مرتب توانیم می: ببخشیم بهبود

روش- 1 به ادغZامی سازی ازمرتب ای نسخهپویا نویسی برنامه

پیوندی- 2 نسخهتر- 3 پیچیده ادغامی الگوریتم

ادغامی: 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 )

mid = low + size -1; high = minimun ) low + 2 * size – 1 , n (;

merge3 ) low , mid , high , S (;

size = 2 * size;

ادغامی :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

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;

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;

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;

list 2 = S ] list 2[ .link;

if ) list 1 ==0( S ] lastsorted [.link = list 2;

else S ] lastsorted [ .link = list 1;

الگوریتم برای اضافی فضای از استفاده -4تحلیل7 (Hادغامی سازی (4مرتب

به اضافی فضای از استفاده حالت هر θ( n)در. دارد تعلق پیوند

از ها θ( n)منظور پیوند تعداد که است پیونداین θ( n)به

. دارد تعلق

سریع 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 (;

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

سازی مرتب در اضافی فضای از استفاده: داد کاهش شیوه پنج به توان می را سریع

روال- 1 زیر quicksort در کدام کنیم می تعیین ،پشته در را آن همواره و تراست کوچک آرایه

. داریم می نگه را دیگری و دهیم می قرار

بد در اضافی فضای از استفاده نسخه این دربه حالت .θ( lg n )ترین دارد تعلق اندیس

از- 2 ای تعداد partitionنسخه که دارد وجودچشمگیر طرزی به را ها رکورد های انتساب

. دهد می کاهش

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

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

A (n) = 0.69 ( n + 1 ) lg n

اعمال- 3 از زیادی مورد pushو popمقدار بیاست.

نوشتن با توانیم تکرار quicksortمی شیوه بهو

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

، بازگشتی و پشته از استفاده جای به یعنیرا پشته

. سازیم می خودمان

سازی- 4 مرتب مثل بازگشتی های الگوریتمکه آستانه مقدار یک تعیین با توان می را سریع

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

. بخشید بهبود

میانه- 5 ، S [low]انتخاب S [ Į low + high )/2 ⌡، S [high]. است محوری ی نقطه برای

سازی 6-7 heapمرتب

است دودویی درخت یک کامل دودویی درخت: باشد زیر شرایط واجد که

. باشند داشته فرزند دو داخلی های گره ی همه عمق رای دا ها برگ ی .dهمه باشند

دودویی درخت یک کامل اساسا دودویی درخت: که است

عمق .n – 1 )تا باشد( کامل دودویی درخت یک عمق با هایی طرف dگره در امکان حد تا

. شوند واقع چپ

heap به است کامل اساس دودویی درخت یک: که طوری

یک از آن های گره در شده نگهداری مقادیر. باشند مرتب مجموعه

یا تر بزرگ گره درهر شده نگهداری مقادیرآن فرزندان در شده نگهداری مقادیر مساوی

باشد.

سازی 2-6-7 مرتب سازی heapپیاده

های داده heap ساختمان struct heap

keytype S ]1..n[;

int heapsize; ;

void siftdown ) heap& H , index i (

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;

if ( siftkey < H.S[largerchild ]) H.S [parent] = H.S[largerchild ];

parent = largerhild;

else spotfound = true;

H.S[parent] = siftkey;

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) ] [

index i;

for ) i = n; i >= 1 ; i --( S ]i[ = root )H(;

void makeheap ) int n,

heap& H)

index i; H.heapsize = n;

for ) i = Į n/2⌡; i >= 1 ; i --(

siftdown )H,i(;

سازی :7-5الگوریتم heapمرتب

void heapsort ) int n , heap& H(

makeheap ) n, H (; removekeys ) n, H , H.S (;

سریع 7-7 سازی مرتب ادغامی، سازی مرتب مقایسهسازی heapومرتب

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

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

گیری 1-8-1 تصمیم ی ها الگوهای درخت برایسازی مرتب

برای : 7-1لم قطعی الگوریتم هر با متناظرسازی تصمیم nمرتب درخت یک متمایز، کلید

و معتبر ، دودویی دقیقا گیری با شده ! nهرس. دارد وجود برگ

توسط :7-2لم شده انجام های مقایسه تعدادبرابر حالت بدترین در گیری تصمیم درخت یک

. است درخت عمق با

اگر: 7-3لمm درخت یک در ها برگ تعدادو dدودویی

: داریم باشد، آن عمق

d ≥ lg m

7-2قضیه

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

lg ) n!( . دهد راانجام ها کلید مقایسه

صحیح :7-4لم و مثبت عدد هر ازای ، nبهداریم:

lg )n!( ≥ n lg n – 1.45 n

7-3قضیه

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

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

n lg n – 1.45n را ها کلید مقایسه. دهد انجام

حالت 3-8-7 در رفتار برای پایینی حدودمیانگین

گیری : 7-5لم تصمیم درخت هر با ظر متناسازی مرتب برای شده هرس معتبر nدودویی

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

. دارد کارایی اول درخت

که : 7-6لم قطعی الگوریتم متمایز nهر کلیدمی سازی مرتب ها کلید مقایسه با فقط را

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

mimEPL )n!( / n!

7-7لم:- دودویی درخت دارای 2هر mکهو باشد برگ

EPL برابر ی )minEPL)mآن همه باید باشد، . باشند سطح ترین پایین در آن های برگ

درخت -:7-8لم دارای 2هر و mکه Eplبرگبرابر آن

minEPL)m( باید ، سطح d – m^2باشد در برگd – 1

درسطح 2m – 2 ^dو برگ dبرگ و باد داشتهدیگری

باشد، .dنداشته است درخت عمق

درخت -: 7-9لم هر ازای و mکه 2به برگEPL برابربا عمق )minEPL)mآن dباشد،

: از است عبارت

d = lg m

مقادیر :7-10لم ی همه ازای m ≥ 1بهداریم :

mimEPL)M( ≥ m Į lg m⌡

7-4قضیه

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

: دهد انجام

n lg n – 1.45n⌡ Į

مرتب ) 9-7 توزیع طریق از سازی مرتب) مبنایی سازی

مبنایی : 7-6الگوریتم سازی مرتب

void radixsort ) node_pointer& mastrrlist ; int numdigits)

index i;

node_pointer list ]0..9[ for ) i = 1 ; i <= numdigits ; i ++(

disteibute )i(; coalesce;

void distrebute ) index i (

index j; node_pointer p;

for ) j = 0 ; j <= 9 ; j++(

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

index j;

masterlist = NULL; for ) j = 0 ; j <= 9 ; j++(

link the nodes in list ]j[ to the end of masterlist;

تشکر با

پایان