algorithm(por amene) - ‫درس طراحی...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: ‫درس طراحی الگوریتم ها‬ ‫)با شبه کد های ‪(++ c‬‬ ‫تعداد واحد: 3‬ ‫تهیه کننده : جعفر پورامینی‬ ‫منبع : کتاب طراحی الگوریتمها‬ ‫مترجم : جعفر نژاد قمی‬ ‫فصل اول:‬ ‫کارایی ، تحلیل و مرتبه الگوریتم‬ ‫ها‬ ‫این کتاب در باره تکنیک های مربوط به حل‬ ‫مسائل است.‬ ‫تکنیک ، روش مورد استفاده در حل مسائل‬ ‫است.‬ ‫مسئله ، پرسشی است که به دنبال پاسخ آن‬ ‫هستیم.‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫بکار بردن تکنیک منجر به روشی گام به گام‬ ‫)الگوریتم ( در حل یک مسئله می شود.‬ ‫منظورازسریع بودن یک الگوریتم، یعنی تحلیل‬ ‫آن از لحاظ زمان و حافظه.‬ ‫‪‬‬ ‫‪‬‬ ‫‪ ‬نوشتن الگوریتم به زبان فارسی دو ایراد‬ ‫دارد:‬ ‫1- نوشتن الگوریتم های پیچیده به این شیوه‬ ‫دشوار است.‬ ‫2- مشخص نیست از توصیف فارسی الگوریتم‬ ‫چگونه‬ ‫می توان یک برنامه کامپیوتری ایجاد کرد.‬ ‫الگوریتم 1-1: جست و جوی ترتیبی‬ Void seqsearch ) intn const keytype[ ]S keytype,x )index& location )index& } ;location = 1 ;location while )location >= n&&) S[location] ! = x while ;++location ;++location if) )location < n ; location = 0 location ‫الگوریتم 2-1:محاسبه مجموع عناصر آرایه‬ number sum )int n ,const number)[ ] s } index; i index number; result number ;result = 0 ;result for)++ )i = 1; i >= n; i for ;[result = result + s[i ;[result return; result return { ‫الگوریتم 3-1:مرتب سازی تعویضی‬ .‫ کلید را به ترتیب غیر نزولی مرتب سازی کنید‬n :‫مسئله‬ void exchangesort )int n ,keytype)[ ] S void } index; i,j index for)++ )i = 1 ; i>= n -1; i for for)++)j = i +1; j >= n ; j if)[ ) S[j] > S[i if ;[exchange S[i] and S[j ;[exchange { ‫الگوریتم 4-1:ضرب ماتریس ها‬ :1-4 ‫الگوریتم‬ void matrixmult )int n void ,[ ] [ ] const number A ,[ ] [ ] const number B ,[ ] [ ] number C } ;index i , j, k ;index )++for ) i = 1; I >= n ; i )++for {)++for )i = 1; j >= n ; j {)++for ;C [i] [j] = 0 ;C for)k = 1 ; k >= n ; k++( [ C [i][j] = C[i] [j] + A [i][k] * B [k][j { { ‫2- 1اهمیت ساخت الگوریتم های کارآمد‬ ‫2-‬ ‫جست و جوی دودویی‬ ‫معمول بسیار سریع تر‬ ‫ازجست و جوی ترتیبی‬ ‫است.‬ ‫تعداد مقایسه های انجام‬ ‫شده توسط جست و‬ ‫جوی دودویی برابر با ‪lg n‬‬ ‫1 + است .‬ ‫‪‬‬ ‫تعداد‬ ‫مقایسه های‬ ‫انجام شده‬ ‫توسط‬ ‫جستجوی‬ ‫دودویی‬ ‫تعداد‬ ‫مقایسه‬ ‫های انجام‬ ‫شده توسط‬ ‫جستجوی‬ ‫ترتیبی‬ ‫اندازه آرایه‬ ‫‪‬‬ ‫8‬ ‫11‬ ‫12‬ ‫33‬ ‫821‬ ‫4201‬ ‫6758401‬ ‫4927694924‬ ‫821‬ ‫4201‬ ‫6758401‬ ‫4927694924‬ ‫الگوریتم 1-1: جست و جوی ترتیبی‬ Void seqsearch ) intn const keytype[ ]S keytype,x )index& location )index& } ;location = 1 ;location while )location >= n&&) S[location] ! = x while ;++location ;++location if) )location < n ; location = 0 location ‫الگوریتم 5-1: جست و جوی دودویی‬ Voidbinsearch )int, n const keytype,[ ] S const keytype, x keytype index&) location index& } index; low, high, mid index ;low = 1 ; high = n ;low ;location = 0 ;location while )low >= high &&} ) location = = 0 while ;⌡mid = Į)low + high(/2 ;⌡mid if)[ ) x = = S [mid if ;location = mid ;location else if)[ )x > S [mid else ;high = mid – 1 ;high else else ;low = mid + 1 ;low { { ‫الگوریتم 6-1: جمله ‪ n‬ام فیبوناچی‬ ‫)بازگشتی(‬ ‫مسئله : جمله ‪ n‬ام از دنباله فیبوناچی را تعیین کنید.‬ ‫‪int fib )int) n‬‬ ‫‪int‬‬ ‫}‬ ‫1 => ‪)if ) n‬‬ ‫‪)if‬‬ ‫‪return; n‬‬ ‫‪return‬‬ ‫‪else‬‬ ‫‪else‬‬ ‫2 – ‪return;)fib )n – 1( + fib )n‬‬ ‫{‬ (‫ام فیبوناچی )تکراری‬n ‫الگوریتم 7-1:جمله‬ int fib2 )int) n int } index; i index ;[int f [0..n ;[int ;f[0] = 0 ;f[0] if} ) )n < 0 if ;f[1] = 1 ;f[1] for)++)i = 2 ; I >= n; i ;[f[i] = f [i -1] + f [i -2 ;[f[i] { return;[ f[n return { ‫1-3 تحلیل الگوریتم ها‬ ‫برای تعیین میزان کارایی یک الگوریتم را باید‬ ‫تحلیل کرد.‬ ‫‪‬‬ ‫1-3-1 تحلیل پیچیدگی زمانی‬ ‫‪ ‬تحلیل پیچیدگی زمانی یک الگوریتم ، تعیین‬ ‫تعداد دفعاتی است که عمل اصلی به ازای‬ ‫هر مقدار از ورودی انجام می شود.‬ ‫‪ (T(n ‬را پیچیدگی زمانی الگوریتم در حالت‬ ‫می گویند.‬ ‫معمول‬ ‫‪ (W(n ‬را تحلیل پیچیدگی زمانی در بدترین‬ ‫حالت‬ ‫می نامند.‬ ‫‪ (A(n ‬را پیچیدگی زمانی در حالت میانگین‬ ‫می گویند.‬ ‫تحلیل پیچیدگی زمانی برای حالت معمول برای‬ ‫الگوریتم)جمع کردن عناصرآرایه(‬ ‫عمل اصلی: افزودن یک عنصر از آرایه به ‪.sum‬‬ ‫اندازه ورودی: ‪ ،n‬تعداد عناصر آرایه.‬ ‫‪T)n( = n‬‬ ‫تحلیل پیچیدگی زمانی برای حالت معمول برای‬ ‫الگوریتم)مرتب سازی تعویضی(‬ ‫عمل اصلی: مقایسه ‪ [S [j‬با ‪. [S[i‬‬ ‫اندازه ورودی: تعداد عناصری که باید مرتب شوند.‬ ‫2/ (1- ‪T)n( = n)n‬‬ ‫تحلیل پیچیدگی زمانی دربدترین حالت برای‬ ‫الگوریتم(جست و جوی ترتیبی)‬ ‫عمل اصلی: مقایسه یک عنصر آرایه با ‪.x‬‬ ‫اندازه ورودی: , ‪ n‬تعداد عناصر موجود در آرایه.‬ ‫‪W )n( = n‬‬ ‫تحلیل پیچیدگی زمانی در بهترین حالت برای‬ ‫الگوریتم)جست وجوی ترتیبی(‬ ‫عمل اصلی: مقایسه یک عنصر آرایه با ‪.x‬‬ ‫اندازه ورودی: , ‪ n‬تعداد عناصر آرایه.‬ ‫1 = (‪B )n‬‬ ‫1-4مرتبه الگوریتم‬ ‫1-4‬ ‫الگوریتم ها یی با پیچیدگی زمانی ازقبیل ‪n‬‬ ‫و‪100n‬‬ ‫را الگوریتم های زمانی خطی می گویند.‬ ‫مجموعه کامل توابع پیچیدگی را که با توابع‬ ‫درجه دوم محض قابل دسته بندی باشند، (²‪n‬‬ ‫‪ ) θ‬می گویند.‬ ‫‪‬‬ ‫‪‬‬ ‫مجموعه ای ازتوابع پیچیدگی که با توابع درجه‬ ‫سوم محض قابل دسته بندی باشند، ‪n³( ) θ‬‬ ‫نامیده می شوند.‬ ‫برخی از گروه های پیچیدگی متداول در زیر‬ ‫داده شده است:‬ ‫‪‬‬ ‫‪‬‬ ‫‪)θ)lg n( >θ )n( >θ )n lg n( >θ )n²( >θ )n³( > θ )2ⁿ‬‬ ‫1-4-2آشنایی بیشتر با مرتبه الگوریتم ها‬ ‫1-4-2‬ ‫بزرگ”‬ ‫مجموعه ای از توابع پیچیدگی ‪ (g (n‬است که برای‬ ‫آن ها یک ثابت حقیقی مثبت ‪ c‬و یک عدد صحیح‬ ‫غیر منفی ‪ N‬وجود دارد به قسمی که به ازای همه‬ ‫ی ‪ N => n‬داریم:‬ ‫داریم‬ ‫برای یک تابع پیچیدگی مفروض ‪ƒ)n( ،O )ƒ )n( “O‬‬ ‫‪‬‬ ‫‪)g )n( <= c × ƒ )n‬‬ ‫برای یک تابع پیچیدگی مفروض ‪ƒ)n( ،)Ω‬‬ ‫‪)ƒ))n‬مجموعه ای از توابع پیچیدگی ‪ (g (n‬است که‬ ‫برای آن ها یک عدد ثابت حقیقی مثبت ‪ c‬و یک عدد‬ ‫صحیح غیر منفی ‪ N‬وجود دارد به قسمی که به‬ ‫ازای همه ی ‪ N => n‬داریم:‬ ‫داریم‬ ‫‪‬‬ ‫‪)g )n( => c × ƒ )n‬‬ ‫برای یک تابع پیچیدگی مفروض ‪ ،ƒ))n‬داریم:‬ ‫‪θ )ƒ)n(( = O )ƒ )n((∩ Ω )ƒ)))n‬‬ ‫یعنی ‪ θ)ƒ)))n‬مجموعه ای از توابع پیچیدگی ‪(g (n‬‬ ‫است که برای آن ها ثابت های حقیقی مثبت ‪ c‬و‪ d‬و‬ ‫عدد صحیح غیر منفی ‪ N‬وجود دارد به قسمی که :‬ ‫‪)c × ƒ )n( >= d × ƒ)n‬‬ ‫برای یک تابع پیچیدگی ‪ ƒ))n‬مفروض،( )‪ƒ)n( “oo‬‬ ‫مفروض، )‪o‬‬ ‫کوچک“ عبارت ازمجموعه کلیه توابع پیچیدگی‪)g )n‬‬ ‫است که این شرط را برآورده می سازند : به ازای‬ ‫هرثابت حقیقی مثبت ‪، c‬یک عدد صحیح غیر منفی‬ ‫‪ N‬وجود دارد به قسمی که به ازای‬ ‫همه ی ‪ N =>n‬داریم:‬ ‫داریم‬ ‫‪‬‬ ‫‪)g )n( => c × ƒ )n‬‬ ‫ویژگی های مرتبه‬ ‫1- ‪ O )ƒ)n(( Є )g )n‬اگروفقط اگر.‪ƒ )n(Є Ω‬‬ ‫‪)ƒ)n(( )g‬‬ ‫‪)))g)n‬‬ ‫‪)))g)n‬‬ ‫2- (((‪ θ Є )g )nƒ)n‬اگروفقط اگر‪ƒ )n(Є θ )g‬‬ ‫(((‪)g ƒ)n‬‬ ‫‪.)))n‬‬ ‫3- اگر 1< ‪ b‬و 1 < ‪ ،a‬در آن صورت:‬ ‫‪log ⁿaЄ θ) )log ⁿb‬‬ ‫4- اگر 0 < ‪، b < a‬در آن صورت:‬ ‫5- به ازای همه ی مقادیر 0 < ‪ a‬داریم :‬ ‫5-‬ ‫‪aⁿЄ)! o )n‬‬ ‫6- اگر‪ c <= 0 ،d <0 ، g )n(Є)) o )ƒ)n‬و‬ ‫اگر‬ ‫‪ h)n( Єθ)))ƒ)n‬باشد، درآن صورت:‬ ‫‪c‬‬ ‫‪× g)n( + d × h )n(Є θ)) )ƒ)n‬‬ ‫7- ترتیب دسته های پیچیدگی زیر را در‬ ‫7-‬ ‫نظربگیرید:‬ ‫‪θ )lg n(θ )n(θ )n lg n(θ )n²(θ )n^j(θ )n^k(θ )aⁿ(θ )bⁿ(θ)! )n‬‬ ‫که در آن 2 < ‪ k < j‬و 1 < ‪ b < a‬است. اگر تابع‬ ‫است‬ ‫پیچیدگی‬ ‫‪ )g )n‬در دسته ای واقع در طرف چپ دسته ی‬ ‫حاوی ‪ƒ) )n‬‬ ‫باشد، در آن صورت:‬ ‫‪g )n(Є)) o )ƒ)n‬‬ ‫فصل دوم:‬ ‫روش تقسیم و حل‬ ‫روش تقسیم و حل یک روش بال به پایین است.‬ ‫حل یک نمونه سطح بالی مسئله با رفتن به‬ ‫جزء و بدست آوردن حل نمونه های کوچکتر‬ ‫حاصل می شود.‬ ‫‪‬‬ ‫‪‬‬ ‫‪ ‬هنگام پی ریزی یک الگوریتم بازگشتی ، باید:‬ ‫1- راهی برای به دست آوردن حل یک نمونه از‬ ‫روی حل یک نمونه ازروی حل یک یا چند نمونه‬ ‫کوچک تر طراحی کنیم.‬ ‫2- شرط)شرایط ( نهایی نزدیک شدن به‬ ‫نمونه)های( کوچک تر را تعیین کنیم.‬ ‫3- حل را در حالت شرط )شرایط(نهایی تعیین‬ ‫کنیم.‬ (‫الگوریتم1-2: جست و جوی دودویی )بازگشتی‬ ‫الگوریتم‬ index location )index low,index) high } index; mid index if) )low < high if return; 0 return } else else mid = Į;⌡)low + high( /2 if)[ )x = = S [mid if return; mid return else if)[ ) x > S [mid else return;) location )low , mid – 1 return else else return;) location )mid + 1, high return { { ‫تحلیل پیچیدگی زانی دربدترین حالت برای الگوریتم‬ ‫جست و جوی دودویی بازگشتی‬ ‫عمل اصلی: مقایسه ‪ x‬با ‪.[S [mid‬‬ ‫اندازه ورودی: ‪ ، n‬تعداد عناصر آرایه.‬ ‫1 + (2 / ‪W )n( = W )n‬‬ ‫(2 / ‪W )n( = W )n‬‬ ‫1 = (1) ‪W‬‬ ‫(1)‬ ‫برای ‪ n <1 ،n‬توانی از 2 است‬ ‫1+‬ ‫‪W )n( = Į lg n ⌡+ 1Є θ) )lg n‬‬ ‫2-2مرتب سازی ادغامی‬ ‫2-2‬ ‫ادغام یک فرآیند مرتبط با مرتب سازی است.‬ ‫ادغام دوطرفه به معنای ترکیب دو آرایه مرتب‬ ‫شده در یک آرایه ی مرتب است.‬ ‫‪‬‬ ‫‪‬‬ ‫‪ ‬مرتب سازی ادغامی شامل مراحل زیر می‬ ‫شود:‬ ‫1- تقسیم آرایه به دو زیر آرایه، هر یک با 2/‪n‬‬ ‫عنصر.‬ ‫عنصر‬ ‫2- حل هر زیر آرایه با مرتب سازی آن.‬ ‫3- ترکیب حل های زیر آرایه ها از طریق ادغام‬ ‫آن ها در یک آرایه مرتب.‬ ‫الگوریتم2-2: مرتب سازی ادغامی‬ ‫الگوریتم‬ void mergsort )int n ,keytype)[ ] S void } const int; h = Į n/2 ⌡ , m = n – h const keytype;[ U [1...h],V [1..m keytype if} ) )n <1 if ;[copy S[1] through S[h] to U[h ;[copy ;[copy S [h + 1] through S[h] to V[1] through V[m ;[copy ;)mergesort)h, U ;)mergesort)h, ;)mergesort)m,V ;)mergesort)m,V ;)merge )h , m , U,V,S ;)merge { { ‫الگوریتم3-2: ادغام‬ ‫ادغام‬ ‫الگوریتم‬ void merg )int h ,int m,const keytype,[ ] U void const keytype ,[ ] V const keytype) [ ] S } index; i , j , k index ;ii = 1; j = 1 ; k = 1 ; while )i >= h&&} ) j >= m while if} )[ )U [i] > V [j if [S [k] = U [i [S ; + +ii + { } else else ;[S [k] = V [j ;[S ;+ +j ;+ { ;+ +k ;+ { )if ) i < h )if [ copy V [j] through V [m] to S [k] through S [ h + m copy else else [ copy U [i] through U [h] to S [k] through S [ h + m { ‫تحلیل پیچیدگی زمانی دربدترین حالت برای الگوریتم 3-‬ ‫2(ادغام)‬ ‫عمل اصلی: مقایسه‪ [U [i‬با . ‪[V[j‬‬ ‫اندازه ورودی:‪ h‬و‪، m‬تعداد عناصر موجود در هر یک از دو‬ ‫آرایه ورودی.‬ ‫1 - ‪W ) h , m( = h + m‬‬ ‫تحلیل پیچیدگی زمانی دربدترین حالت برای الگوریتم 2-‬ ‫2( مرتب سازی ادغامی)‬ ‫عمل اصلی: مقایسه ای که درادغام صورت می پذیرد.‬ ‫اندازه ورودی: ‪ ، n‬تعداد عناصر آرایه ‪.S‬‬ ‫(‪W )n‬‬ ‫=‬ ‫+ (‪W )h( + W ) m‬‬ ‫1–‪h +m‬‬ ‫(‪)n‬‬ ‫↓‬ ‫↓‬ ‫↓‬ ‫زمان لزم برای مرتب‬ ‫زمان لزم برای مرتب سازی ‪V‬‬ ‫سازی ‪U‬‬ ‫زمان لزم برای ادغام‬ ‫+ )2 / ‪W (n) = 2 W( n‬‬ ‫)‪(n‬‬ ‫0 = )1( ‪W‬‬ ‫)1(‬ ‫برای 1< ‪ n‬که ‪ n‬توانی از 2 است‬ ‫است‬ ‫1- ‪n‬‬ ‫‪W) n (Є θ ) ) n lg n‬‬ ( )2mergesort 2 ‫الگوریتم4-2: مرتب سازی ادغامی‬ ‫الگوریتم‬ voidmergesort2 )index low,index) high } ;index mid ;index } )if )low > high )if ;⌡ mid = Į ) low + high( / 2 ;⌡ ;)mergesort 2 )low, mid ;)mergesort ;)mergesort 2 )mid +1, high ;)mergesort )merge2)low,mid,high )merge2)low,mid,high { { 2‫الگوریتم5-2:ادغام‬ ‫الگوریتم‬ ‫ ایجاد شده‬mergesort‫ که در‬S ‫مسئله: ادغام دو آرایه ی مرتب‬ ‫مسئله‬ ‫که در‬ .‫اند‬ void mrge2 )index low, index mid,index) high void } index; i, j , k index keytype[ U [ low..high keytype ;ii = low; j = mid +1 ; k = low ; while ) i >= mid &&} )j >= high if} ) [ ) S [i] > S [j if ;[U [k] = S [i ;[U ;++i { } else else [U [k] = S [j [U ;++ j ;++ { ;++ k ;++ { if) ) i < mid [move S [j] through S [high] to U [k] through U [high [move else else [move S [i] through S [mid] to U [k] through U [high [move [move U [low] through U [high] to S [low] through S [high [move { ‫2-3روش تقسیم و حل‬ ‫2-3‬ ‫راهبرد طراحی تقسیم و حل شامل مراحل زیر‬ ‫است:‬ ‫1- تقسیم نمونه ای ازیک مسئله به یک یا چند‬ ‫نمونه کوچکتر.‬ ‫2- حل هر نمونه کوچکتر. اگر نمونه های کوچک تر‬ ‫به قدر کوچک تر به قدر کافی کوچک نبودند،‬ ‫برای این منظور از بازگشت استفاده کنید.‬ ‫3- در صورت نیاز، حل نمونه های کوچک تر را‬ ‫ترکیب کنید تا حل نمونه اولیه به دست آید.‬ ‫2-4 مرتب سازی سریع )‪(quicksort‬‬ ‫در مرتب سازی سریع، ترتیب آنها از چگونگی‬ ‫افراز آرایه ها ناشی می شود.‬ ‫همه عناصر کوچک تر آز عنصر محوری در‬ ‫طرف چپ آن وهمه عناصربزرگ تر، درطرف‬ ‫راست آن واقع هستند.‬ ‫‪‬‬ ‫‪‬‬ ‫‪ ‬مرتب سازی سریع، به طور بازگشتی‬ ‫فراخوانی می شود تا‬ ‫هر یک از دوآرایه را مرتب کند، آن ها نیز افراز‬ ‫می شوند‬ ‫واین روال ادامه می یابد تا به آرایه ای با یک‬ ‫عنصربرسیم.‬ ‫چنین آرایه ای ذاتاً مرتب است.‬ ‫الگوریتم6-2 :مرتب سازی سریع‬ ‫الگوریتم‬ .‫ کلید با ترتیب غیر نزولی‬n ‫مسئله: مرتب سازی‬ ‫مسئله‬ void) quicksort )index low , index high void } ;index pivotpoint ;index } )if ) high < low )if )partition )low , high , pivotpoint )partition )quicksort )low , pivotpoint – 1 )quicksort ;)quicksort )pivotpoint + 1 , high ;)quicksort { { ‫الگوریتم7-2: افراز آرایه‬ ‫الگوریتم‬ .‫ برای مرتب سازی سریع‬S ‫مسئله: افراز آرایه‬ ‫مسئله‬ voidpartition )index low,index) high index &) pivotpoint index } index; i , j index keytype; pivotitem keytype ;[pivotitem = S [low ;[pivotitem j = low low for)++ ) i = low +1 ; i >= high; i if} ) ) S [i] > pivotitem ;++j ;++j ;[exchange S [i] and S [j ;[exchange { ;pivotpoint = j ;pivotpoint ;[exchange S [low] and S [ pivotpoint ;[exchange { ‫تحلیل پیچیدگی زمانی در حالت معمول برای الگوریتم 7-‬ ‫2( افراز)‬ ‫عمل اصلی: مقایسه‪ [S [i‬با ‪. pivotitem‬‬ ‫اندازه ورودی: 1+ ‪ ، n = high – how‬تعداد عناصرموجود‬ ‫در زیر آرایه.‬ ‫1 - ‪T)n( = n‬‬ ‫تحلیل پیچیدگی زمانی در بدترین حالت برای الگوریتم 6-‬ ‫2(مرتب سازی سریع)‬ ‫عمل اصلی: مقایسه‪ [S [i‬با ‪ pivotitem‬در روال ‪. partition‬‬ ‫اندازه ورودی: ‪ ، n‬تعداد عناصر موجود درآرایه ‪.S‬‬ ‫= (‪T)n‬‬ ‫1 – ‪T)0( + T) n – 1( + n‬‬ ‫(‪T)n‬‬ ‫↓‬ ‫↓‬ ‫↓‬ ‫زمان‬ ‫زمان‬ ‫زمان لزم برای افراز زمان لزم برای مرتب سازی‬ ‫لزم برای مرتب سازی‬ ‫زیر آرایه طرف چپ‬ ‫زیرآرایه طرف راست‬ n<0 T )0( = 0 )0( T )n( = T )n – 1( + n – 1 ‫به ازای‬ W )n( = n )n – 1( / 2Є θ) )n² ‫تحلیل پیچیدگی زمانی در حالت میانگین برای الگوریتم‬ ‫6-2(مرتب سازی سریع)‬ ‫عمل اصلی: مقایسه‪ [S [i‬با ‪ pivotitem‬در ‪. partition‬‬ ‫اندازه ورودی: ‪ ، n‬تعداد عناصر موجود در ‪.S‬‬ ‫‪A )n(Є θ) )n lg n‬‬ ‫2-5الگوریتم ضرب ماتریس استراسن‬ ‫2-5‬ ‫پیچیدگی این الگوریتم از لحاظ ضرب، جمع و‬ ‫تفریق بهتر از پیچیدگی درجه سوم است.‬ ‫روش استراسن در مورد ضرب ماتریس های‬ ‫2×2 ارزش چندانی ندارد.‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم 8-2: استراسن‬ ‫استراسن‬ n ‫ که در آن‬n×n ‫مسئله : تعیین حاصلضرب دو ماتریس‬ .‫توانی از 2 است‬ void starssen ) int n void ,n × n _ matrix A ,n ,n × n _ matrix B ,n )n × n _ matrix & C )n } )if ) n >= threshold ;compute C = A × B using the standard algorithm ;compute } else ;partition A into four submatrics A 11,A 12 ,A21,A22 partition ;partition B into four submatrics B 11,B 12 ,B21,B22 partition ;compute C = A × B using Starssen‘s Method ;compute { { ‫تحلیل پیچیدگی زمانی تعداد ضرب ها در الگوریتم 8-‬ ‫2(استرسن)در حالت معمول‬ ‫عمل اصلی: یک ضرب ساده.‬ ‫اندازه ورودی:‪ ، n‬تعداد سطرها و ستون ها در ماتریس.‬ ‫/ ‪T )n( = 7 T )n‬‬ ‫1 = (1) ‪T‬‬ ‫(1)‬ ‫به ازای 1 < ‪ n‬که ‪ n‬توانی از 2است‬ ‫2)‬ ‫18.2^ ‪T )n(Є θ) ) n‬‬ ‫تحلیل پیچیدگی زمانی تعدادجمع هاو تفریقهای‬ ‫الگوریتم (استرسن)درحالت معمول‬ ‫عمل اصلی: یک جمع یا تفریق ساده.‬ ‫اندازه ورودی:‪ ، n‬تعداد سطرها و ستون ها در ماتریس.‬ ‫به ازای 1 < ‪ n‬که ‪ n‬توانی از 2است= (‪n/2(²( 18 +)T )n‬‬ ‫2/‪7T)n‬‬ ‫1=(1)‪T‬‬ ‫18.2 ^ ‪T ) n (Є θ) ) n‬‬ ‫الگوریتم9-2: ضرب اعداد صحیح بزرگ‬ ‫الگوریتم‬ v ‫ و‬u ‫مسئله: ضرب دو عدد صحیح بزرگ‬ ‫مسئله‬ large _ integer)prod ) large_integer u, large_integer v } large_inreger; x , y , w , z large_inreger int; n , m int )n = maximum)number of digits in u,number of digits in v )n )if )u = = 0 || v = = 0 )if ; return 0 return )n > = threshold return; u × v obtained in the usual way return } else ;⌡ m = Į n / 2 ;⌡ ; x = udivide 10 ^ m ; y =rem 10 ^m ; w = vdivide 10 ^ m; z = rem 10 ^m return prod )x ,w( × 10 ^2m + ) prod ) x, z( + prod return ;) )w, y (( × 10 ^ m + prod ) y, z { { (else if else ‫تحلیل پیچیدگی زمانی در بدترین حالت برای ا لگوریتم9-‬ ‫2( ضرب اعداد صحیح)‬ ‫عمل اصلی: دستکاری یک رقم دهدهی در یک عدد صحیح‬ ‫بزرگ در‬ ‫هنگام جمع کردن ، تفریق کردن، یا انجام اعمال01 ‪divide‬‬ ‫‪، ^m‬‬ ‫‪ rem 10 ^m‬یا ×01 ^ ‪ .m‬هر یک از این اعمال را ‪ m‬بار انجام‬ ‫‪ rem‬یا‬ ‫می دهد.‬ ‫اندازه ورودی: ‪ ، n‬تعداد ارقام هر یک از دو عدد صحیح.‬ ‫به ازای ‪ n < s‬که ‪ n‬توانی از 2است+ (2 / ‪W ) n ( = 4 W )n‬‬ ‫‪cn‬‬ ‫0=(‪W)s‬‬ 2 ‫الگوریتم 01-2: ضرب اعداد صحیح بزرگ‬ large_integer prod2 )large_integer u ,large_ integer) v large_integer } large_integer; x , y , w , z , r , p , q large_integer int; n , m int ;)n = maximum )number of digits in u,number of digits in v ;)n if) )u = = 0 || v = = 0 return; 0 (else if else return return )n > = threshold ; u × v obtained in the usual way } else ;⌡ m = Į n / 2 ;⌡ ; x = udivide 10 ^ m ; y =rem 10 ^m ; w = vdivide 10 ^ m; z = rem 10 ^m ;) r = prod2 )x + y, w + z ;) ) p = prod2 ) x , w prod2 ;) q = prod2 ) y , z ;) ; return p ×10 ^ 2m + ) r – p – q ( × 10 ^ m +q { { ‫تحلیل پیچیدگی زمانی در بدترین حالت برای الگوریتم01-2(‬ ‫ضرب اعداد صحیح2)‬ ‫عمل اصلی: دستکاری یک رقم دهدهی در یک عدد صحیح‬ ‫بزرگ در‬ ‫هنگام جمع کردن ، تفریق کردن، یا انجام اعمال01 ‪divide‬‬ ‫‪، ^m‬‬ ‫‪ rem 10 ^m‬یا ×01 ^ ‪ .m‬هر یک از این اعمال را ‪ m‬بار انجام‬ ‫‪ rem‬یا‬ ‫می دهد.‬ ‫اندازه ورودی: ‪ ، n‬تعداد ارقام هر یک از دو عدد صحیح.‬ ‫به ازای ‪ n < s‬که ‪ n‬توانی از 2است‬ ‫‪3W)n/2(+ c n >=W )n( >= 3W )n / 2 +1( + c n‬‬ ‫0 = (‪W )s‬‬ ‫(‪)s‬‬ ‫فصل سوم:‬ ‫برنامه نویسی پویا‬ ‫برنامه نویسی پویا، از این لحاظ که نمونه به‬ ‫نمونه های کوچکتر تقسیم می شود ، مشابه‬ ‫روش تقسیم و حل است ولی در این روش ،‬ ‫نخست نمونه های کوچک تر را حل می کنیم ،‬ ‫نتایج را ذخیره می کنیم و بعدا هر گاه به یکی از‬ ‫آن ها نیاز پیدا شد، به جای محاسبه دوباره‬ ‫کافی است آن را بازیابی کنیم.‬ ‫‪‬‬ ‫‪ ‬مراحل بسط یک الگوریتم برنامه نویسی پویا به‬ ‫شرح زیر است:‬ ‫1- ارائه یک ویژگی بازگشتی برای حل نمونه ای‬ ‫از مسئله .‬ ‫2- حل نمونه ای از مسئله به شیوه جزء به کل با‬ ‫حل نمونه های کوچک تر.‬ ‫الگوریتم 3-1: ضریب دو جمله ای با استفاده از‬ ‫تقسیم و حل‬ int bin ) int n , int)k int } if) ) k == 0 || n ==k return; 1 return else else return;)bin )n – 1 , k -1 ( + bin ) n-1 , k { ‫الگوریتم 2-3: ضریب دو جمله ای با استفاده از‬ ‫برنامه نویسی پویا‬ int bin2 )int n ,int) k int } index; i , j index int[ B [0..n][0..k int for)++ ) i = 0; i ≥ n ; i for if) ) j == 0 || j == i ;B [i] [j] = 1 ;B else else ;[B [i] [j] = B [ i – 1 ] [ j -1 ] + B [ i -1 ] [j ;[B return:[B[n] [k { ‫الگوریتم 3-3: الگوریتم فلوید برای یافتن کوتاه‬ ‫ترین مسیر‬ void floyd ) int n void const number, W const number, D number } index; i , j , k index ;D =W for)++ ) k = 1 ; k ≥ n ; k for for)++) i = 1; i ≥ n ; i for)++ ) j = 1 ; j ≥ n ; j for D [i] [j] = minimum ) D [i][j], D[i][k] + D[k] [i] ;)[[j { ‫تحلیل پیچیدگی زمانی در بدترین حالت برای ا لگوریتم3-‬ ‫3‬ ‫(الگوریتم فلوید برای یافتن کوتاهترین مسیر)‬ ‫عمل اصلی: دستورهای موجود در حلقه ‪. for‬‬ ‫اندازه ورودی:‪ ، n‬تعداد رئوس گراف.‬ ‫³‪T )n( = n × n × n = n³Є θ) )n‬‬ ‫الگوریتم 4-3:الگوریتم فلوید برای یافتن‬ 2 ‫کوتاهترین مسیر‬ voidfloyd2 ) int,n const number, W const number, D number index) P } index; i , j , k index for ) i = 1 ; i≥)++ n ; i for ) j = 1 ; j≥)++ n ; j ;P [i] [j] = 0 ;D = W ;D for)++ ) k = 1 ; k >= n ; k for)++ ) i = 1 ; i >= n ; i for for)++ ) j = 1 ; j >= n ; j if} ) [) D [i] [k] + D [k] [j] > D [i] [j ;P [i] [j] = k ;P ;[D [i] [j] = D [i] [k] + D [k] [j ;[D { { ‫الگوریتم 5-3:چاپ کوتاهترین مسیر‬ ‫مسئله: چاپ رئوس واسطه روی کوتاه ترین مسیر از راسی به راس دیگر‬ ‫در یک گراف موزون.‬ ‫‪void path )index) q , r‬‬ ‫‪void‬‬ ‫}‬ ‫0 =! ]‪if} ) )P [q] [r‬‬ ‫‪;) [path )q , P [q] [r‬‬ ‫);‬ ‫‪cout;[ >> ”v“ >> P [q] [r‬‬ ‫‪cout‬‬ ‫‪;) path )P [q] [r] , r‬‬ ‫);‬ ‫{‬ ‫{‬ ‫3-3 برنامه نویسی پویا و مسائل بهینه‬ ‫سازی‬ ‫حل بهینه ، سومین مرحله از بسط یک الگوریتم‬ ‫برنامه نویسی پویا برای مسائل بهینه سازی‬ ‫است. مراحل بسط چنین الگوریتمی به شرح‬ ‫زیر است:‬ ‫‪‬‬ ‫1- ارائه یک ویژگی بازگشتی که حل بهینه ی نمونه‬ ‫ای از مسئله را به دست می دهد.‬ ‫2- محاسبه مقدار حل بهینه به شیوه ی جزء به‬ ‫کل.‬ ‫3- بنا کردن یک حل نمونه به شیوه ی جزء به کل.‬ ‫هر مسئله بهینه سازی را نمی توان با استفاده‬ ‫از برنامه نویسی پویا حل کرد چرا که باید اصل‬ ‫بهینگی در مسئله صدق کند.‬ ‫اصل بهینگی در یک مسئله صدق می کند اگریک‬ ‫حل بهینه برای نمونه ای از مسئله ، همواره‬ ‫حاوی حل بهینه برای همه ی زیر نمونه ها‬ ‫باشد.‬ ‫‪‬‬ ‫‪‬‬ ‫3-4 ضرب زنجیره ای ماتریس ها‬ ‫هدف بسط الگوریتمی است که ترتیب بهینه را‬ ‫برای ‪ n‬ماتریس معین کند.‬ ‫ترتیب بهینه فقط به ابعاد ماتریس ها بستگی‬ ‫دارد.‬ ‫علوه بر ‪ ، n‬این ابعاد تنها ورودی های الگوریتم‬ ‫هستند.‬ ‫این الگوریتم حداقل به صورت نمایی است.‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم 6-3: حداقل ضرب ها‬ int minimult )int, n int const int, d const index) P } index; i , j , k , diagonal int;[ M [1..n] [1..n int for ) i = 1 ; i ≥)++ n ; i for :M [i] [i] = 0 :M for )diagonal = 1; diagonal ≥)++ n -1 ; diagonal for for ) i = 1 ; i≥} )++ n – diagonal ; i for ; j = i + diagonal diagonal + [M[i][j] = minimum )M[i][k] + M[k +1 ][j ;)[d [ i – 1] * d [k] * d [j ;)[d P [i][j] =;a value of k that gave the minimum { return;[ M[1][n return { ‫تحلیل پیچیدگی زمانی حالت معمول برای ا لگوریتم6-‬ ‫3( حداقل ضرب ها)‬ ‫عمل اصلی: می توان دستورات اجرا شده برای هر مقدار‬ ‫‪ k‬را عمل اصلی در نظر بگیریم. مقایسه ای را که برای‬ ‫آزمون حداقل انجام می شود، به عنوان عمل اصلی در‬ ‫نظر می گیریم.‬ ‫اندازه ورودی: ‪ ، n‬تعداد ماتریس ها که باید ضرب شوند.‬ ‫³‪N )n -1( )n + 1( / 6Є θ) )n‬‬ ‫الگوریتم 7-3: چاپ ترتیب بهینه‬ .‫ ماتریس‬n ‫مسئله: چاپ ترتیب بهینه برای ضرب‬ ‫ماتریس‬ ‫مسئله‬ void order )index i,index) j } if) ) i == j if cout; >> ”A“ >> i } else else ;[k = P [i] [j ;[k ;“(“ << cout ;“(“ cout ;)order ) i , k ;)order ;) order ) k +1 , j ;) ;”)“ << cout ;”)“ cout { { ‫3-5 درخت های جست و جوی دودویی بهینه‬ ‫درخت جست و جوی دودویی یک دودویی از‬ ‫عناصر) که معمول کلید نامیده می شوند(است که از‬ ‫یک مجموعه مرتب حاصل می شود، به قسمی که:‬ ‫‪‬‬ ‫1- هر گره حاوی یک کلید است.‬ ‫2- کلید های موجود در زیردرخت چپ یک گره‬ ‫مفروض، کوچک تر یا مساوی کلید آن گره‬ ‫هستند.‬ ‫3- کلیدهای موجود درزیردرخت راست یک گره‬ ‫مفروض، بزرگ تر یا مساوی کلید آن گره‬ ‫هستند.‬ ‫الگوریتم 8-3: درخت جست و جوی دودویی‬ void search )node _ pointer, tree void keytype, keyin node _ poiner &) p node } bool; found bool ;p = tree ;p ;found = false ;found while) )! found while if) ) p - < key == keyin if ; found = true found else if) ) keyin > p - < key else ; p = p -< left -< else else ; p = p - < right right { ‫الگوریتم 9-3 : درخت جست و جوی بهینه‬ ‫مسئله: تعیین یک درخت جست وجوی بهینه برای مجموعه‬ ‫مسئله‬ ‫ای از کلید ها، هر یک با احتمالی مشخص.‬ ‫‪void optsearchtree )int, n‬‬ ‫‪const float; p‬‬ ‫‪const‬‬ ‫‪float &, minavg‬‬ ‫‪float‬‬ ‫‪index) R‬‬ ‫‪index‬‬ ‫}‬ ‫‪index; i , j , k , diagonal‬‬ ‫‪index‬‬ float;[ A [1..n + 1] [0..n float for ) i = 1 ; i≥} )++ n ; i A [i] [i -1] = 0 [i] ;[A [i] [i] = p [i ;[A ; R [i] [i] = i [i] ;R [i] [ i – 1 ] = 0 ;R { ; A[ n + 1 ] [n] = 0 A[ ; R[ n + 1 ] [n] = 0 R[ for )diagonal = 1;diagonal≥)++ n – 1; diagonal for for ) i = 1; i≥ } )++ n – diagonal ; i ; j = i + diagonal diagonal A[i][j] = minimum)A[i][k-1]+A[k+1][j](+∑pm A[i][j] R[i][j] =;a value of k that gave the minimum { ;[minavg = A [1][n ;[minavg { ‫تحلیل پیچیدگی زمانی حالت معمول برای ا لگوریتم‬ ‫درخت جستجوی دودویی بهینه‬ ‫عمل اصلی: دستورات اجرا شده به ازای هر مقدار از ‪k‬‬ ‫.این دستورات شامل یک مقایسه برای آزمون حداقل‬ ‫است.‬ ‫اندازه ورودی: ‪ ، n‬تعداد کلید.‬ ‫³‪T)n( = n ) n -1( ) n + 4 ( / 6Є θ) ) n‬‬ ‫الگوریتم 01 -3: ساخت درخت جست و جوی‬ ‫دودویی بهینه‬ node _ pointer tree ) index) i , j node } index; k node _ pointer; p node ;[k = R [i] [j ;[k if) ) k == 0 return; NULL return } else else ; p = new nodetype new ; [p - < key = key [k [p ;(p - < left = tree (i , k – 1 ;(p ;(p - < right = tree ( k+1 , j ;(p return; P { { ‫الگوریتم11-3:الگوریتم برنامه نویسی پویا برای‬ ‫الگوریتم‬ ‫مسئله فروشنده دوره گرد‬ void tarvel ) int , n void const number, [ ][ ] W const index, [ ] [ ] P number &) minlength number } index; i , j , k ; [ { number D[1..n][subset of V - { v1 number for ) i = 2 ; i≥)++ n ; i for ; [D[i] [Ø] = W [i] [1 [D[i] for )k = 1 ; k≥)++ n - 2 ; k )for )all subsets A Ç V – { v1 } containing k vertices )for for )i such that i != 1 and vi}) is not inA for ;)[{D[i] [A] = minimum ) W [i] [j] + D [j] [A – {vj ;)[{D[i] ;P [i] [A] = value of j that gave the minimum ;P D [1] [ V – { v1 + [ } ] = minimum ) W [1] [j [1] ;) [ { D [j] [ V – { v1 – vj ;) [j] P [1] [ V – { v1 } ] = value of j that gave the [1] ; minimum ;[ { minlength = D [1] [ V – { v1 ;[ minlength { ‫تحلیل پیچیدگی فضا و زمان در حالت معمول برای ا‬ ‫لگوریتم 11-3 ( الگوریتم برنامه نویسی پویا برای مسئله‬ ‫فروشنده دوره گرد)‬ ‫عمل اصلی: زمان در هر دو حلقه ی اول و آخر ، در‬ ‫مقایسه با زمان در حلقه میانی چشمگیر نیست، زیرا حلقه‬ ‫میانی حاوی سطوح گوناگون تودر تویی است . دستورات‬ ‫اجرا شده برای هر مقدار ‪ vj‬را می توان عمل اصلی در‬ ‫نظر گرفت.‬ ‫اندازه ورودی : ‪ ، n‬تعداد رئوس موجود در گراف.‬ ‫‪T )n( = n 2ⁿЄ θ) ) n 2ⁿ‬‬ ‫فصل چهارم:‬ ‫روش حریصانه در طراحی‬ ‫الگوریتم‬ ‫الگوریتم حریصانه ، به ترتیب عناصر را گرفته ،‬ ‫هر بار آن عنصری را که طبق ملکی معین‬ ‫“بهترین” به نظر می رسد، بدون توجه به‬ ‫انتخاب هایی که قبل انجام داده یا در آینده انجام‬ ‫خواهد داد، بر می دارد.‬ ‫‪‬‬ ‫الگوریتم حریصانه ، همانند برنامه نویسی پویا‬ ‫غالبا برای حل مسائل بهینه سازی به کار می‬ ‫روند، ولی روش حریصانه صراحت بیشتری‬ ‫دارد.‬ ‫در روش حریصانه ، تقسیم به نمونه های کوچک‬ تر صورت نمی پذیرد.‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم حریصانه با انجام یک سری انتخاب، که‬ ‫هر یک در لحظه ای خاص ،بهترین به نظر می‬ ‫رسد عمل می کند، یعنی انتخاب در جای خود‬ ‫بهینه است.امید این است که یک حل بهینه‬ ‫سرتاسری یافت شود، ولی همواره چنین‬ ‫نیست.‬ ‫برای یک الگوریتم مفروض باید تعیین کرد که آیا‬ ‫حل همواره بهینه است یا خیر.‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم حریصانه ، کار را با یک مجموعه تهی‬ ‫آغاز کرده به ترتیب عناصری به مجموعه اضافه‬ ‫می کند تا این مجموعه حلی برای نمونه ای از‬ ‫یک مسئله را نشان دهد.‬ ‫هر دور تکرار ، شامل مولفه های زیر است:‬ ‫‪‬‬ ‫1- روال انتخاب، عنصربعدی را که باید به‬ ‫مجموعه اضافه شود،انتخاب می کند.انتخاب‬ ‫طبق یک ملک حریصانه است.‬ ‫2- بررسی امکان سنجی ، تعیین می کند که آیا‬ ‫مجموعه جدید برای رسیدن به حل،عملی است‬ ‫یا خیر.‬ ‫3- بررسی راه حل ، تعیین می کند که آیا‬ ‫مجموعه جدید ، حل نمونه را ارائه می کند یا‬ ‫خیر.‬ ‫4-1 درخت های پو شای کمینه‬ ‫فرض کنید طراح شهری می خواهد چند شهر‬ ‫معین را با جاده به هم وصل کند، به قسمی که‬ ‫مردم بتوانند از هر شهر به شهر دیگر بروند. اگر‬ ‫محدودیت بودجه ای در کار باشد ، ممکن است‬ ‫طراح بخواهد این کار را با حداقل مقدار جاده‬ ‫کشی انجام دهد.‬ ‫برای این مسئله دو الگوریتم حریصانه متفاوت :‬ ‫پریم و کروسکال بررسی می شود.‬ ‫‪‬‬ ‫‪‬‬ ‫هر یک از این الگوریتم ها از یک ویژگی بهینه‬ ‫محلی استفاده می کند.‬ ‫تضمینی وجود ندارد که یک الگوریتم حریصانه‬ ‫همواره حل بهینه بدهد، ثابت می شود که‬ ‫الگوریتم های کروسکال و پریم همواره درخت‬ ‫های پوشای کمینه را ایجاد می کنند.‬ ‫‪‬‬ ‫‪‬‬ ‫4-1-1الگوریتم پریم‬ ‫4-1-1‬ ‫الگوریتم پریم با زیر مجموعه ای تهی از یال‬ ‫های ‪ F‬و زیرمجموعه ای از رئوس ‪ Y‬آغاز می‬ ‫شود، زیرمجموعه حاوی یک راس دلخواه است.‬ ‫به عنوان مقداراولیه، }1‪{v‬‬ ‫را به ‪ Y‬می دهیم . نزدیک ترین را س به ‪، Y‬‬ ‫راسی در ‪ V – Y‬است که توسط یالی با وزن‬ ‫متصل‬ ‫کمینه به راسی در ‪Y‬‬ ‫متصل‬ ‫است.‬ ‫‪‬‬ ‫الگوریتم 1-4: الگوریتم پریم‬ void prim )int, n void const number,[ ] [ ] W const set_ of_edges &) F set_ } index; i , vnear index number; min edge; e edge index;[ nearest [2..n number;[ distance [2..n number ;F=Ø for ) i = 2 ; i≥} )++ n ; i ; narest [i] = 1 narest ; [distance [i] = W [1] [i [distance { repeat} ) ) n-1 times repeat ; ∞ = min min for)++ ) i = 2 ; i > = n ; i for if ) 0 ≥} ) distance [i] > min if ; [min = distance [i [min ; vnear = i vnear { e = edge connecting vertices indexed by ;[ near and nearest [ vnear ; add e to F add ; distance [ vnear ] = -1 distance for ) i = 2 ; i≥)++ n ; i for if} )[) W[i] [ vnear ] > distance [i ; [ distance [i] = W [i] [ vnear distance ; nearest [i] = vnear nearest { { { ‫تحلیل پیچیدگی زمانی در حالت معمول برای ا لگوریتم‬ ‫1-4(الگوریتم پریم)‬ ‫عمل اصلی: در حلقه ‪ repeat‬دو حلقه وجود دارد که هر یک‬ ‫(1 – ‪) n‬‬ ‫بار تکرار می شود . اجرای دستورات داخل هر یک از آن ها‬ ‫را می توان‬ ‫به عنوان یک بار اجرای عمل اصل در نظر گرفت.‬ ‫اندازه ورودی: ‪ ، n‬تعداد رئوس.‬ ‫²‪T )n( = 2 ) n – 1( ) n – 1(Є θ) ) n‬‬ ‫قضیه 1-4‬ ‫الگوریتم پریم همواره یک درخت پوشای‬ ‫کمینه تولید می کند.‬ ‫‪‬‬ ‫اثبات : برای آ ن که نشان دهیم مجموعه ‪ F‬پس از‬ ‫هر بار تکرارحلقه ‪ ،repeat‬امید بخش است‬ ‫ازاستقرا استفاده می کنیم.‬ ‫مبنای استقرا : واضح است که مجموعه ‪ Ø‬امید‬ ‫امید‬ ‫بخش است.‬ ‫الگوریتم 4-2: الگوریتم کروسکال‬ void kruskal ) intn , int, m void set _ of _ edges, E set set _ of _edges) & F set } index; i , j index set _pointer; p , q set edge; e edge sort the m edges in E by weight in sort ;nondecreasing order ;nondecreasing ;F=Ø ; )intitial )n )intitial while})) number of edges in F is less than n-1 while e = edge with least weight not yet edge ; considered considered ;ii , j = indices of vertices connected by e ; ; )p = find )i )p ; )q = find )i )q if} )) )! equal ) p, q if ; ) merge ) p , q merge ; add e to F add { { { ‫تحلیل پیچیدگی زمانی در بدترین حالت برای ا لگوریتم‬ ‫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 ( W ) m, n (Є θ n² lg n‬‬ ‫قضیه 2-4‬ ‫الگوریتم کروسکال همواره یک درخت پوشای‬ ‫کمینه تولید می کند.‬ ‫‪‬‬ ‫اثبات : اثبات از طریق استقرا با شروع از‬ ‫مجموعه ای تهی از یال ها آغاز می شود.‬ ‫4-2 الگوریتم دیکسترا برای کوتاهترین‬ ‫مسیر تک مبدا‬ ‫برای کوتاهترین مسیر از هر راس به همه رئوس‬ ‫دیگر در یک گراف موزون و بدون جهت یک‬ ‫الگوریتم)²‪ θ(n‬از روش حریصانه داریم، که آن‬ ‫دیکسترا نام دارد.‬ ‫‪‬‬ ‫الگوریتم را با این فرض ارائه می دهیم که از‬ ‫راس مورد نظر به هر یک از رئوس دیگر،‬ ‫مسیری وجود دارد.‬ ‫این الگوریتم مشابه الگوریتم پریم برای مسئله‬ ‫درخت پوشای کمینه است.‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم3-4: الگوریتم دیکسترا‬ ‫الگوریتم‬ void dijkstra ) int, n void const number,[ ] [ ] W const set _ of _ edges &) F set } index,i , vnear edge; e edge index;[ touch [2..n index number;[ length[2..n number ;F=Ø for ) i = 2; i ≥} ) ++ n ; i for ; touch [i] = 1 touch ;[length [i] = W [1][i ;[length { } ) repeat ) n – 1 times repeat ; ∞ = min min for ) i = 2 ; i ≥)++ n ; i for if} ) ) 0 >= length [i] > min if ; [min = length [i [min ; vnear = i vnear { [e = edge from vertix indexed by touch [vnear [e ;to vertex indexed by vnear ;to ;add e to F ;add for ) i = 2 ; i≥)++ n; i for if} )[) length [vnear] + W [vnear] [i] > length[i ;[length [i] = length [vnear] + W [vnear] [i ;[length ; touch [i] = vnear touch { ;length [vnear] = -1 ;length { { ‫قضیه 3-4‬ ‫تنها زمان بندی که زمان کل درسیستم را‬ ‫کمینه سازی می کند، زمان بندی است که‬ ‫در آن کارها بر حسب افزایش زمان ارائه‬ ‫خدمات مرتب می شوند.‬ ‫الگوریتم 4-4 : زمان بندی با مهلت معین‬ ‫مسئله : تعیین زمان بندی با سود کل بیشینه ، با این فرض‬ ‫که هر کاری دارای سود است و فقط وقتی قابل حصول‬ ‫است که آن کار در مهلت مقررش انجام شود.‬ ‫‪void schedule ) int, n‬‬ ‫‪const int, [ ] deadline‬‬ ‫‪const‬‬ ‫‪sequence _ of _ integer&) j‬‬ ‫‪sequence‬‬ ‫}‬ ‫‪; index i‬‬ ‫‪index‬‬ sequence_ of_integer; K sequence_ ;[j = [1 ;[j for ) i = 2 ; i≥} )++ n ; i for K = J with i added according to nondecreasing with ;[values of deadline [i ;[values if) ) K is feasible if ;J = K ;J { { ‫تحلیل پیچیدگی زمانی در بدترین حالت برای ا لگوریتم‬ ‫زمان بندی با مهلت معین‬ ‫عمل اصلی: باید برای مرتب سازی کارها، مقایسه هایی‬ ‫انجام پذیرد و هنگامی که ‪ K‬با ‪( J‬پس از افزوده شدن کار‬ ‫‪ i‬ام ) مساوی قرار داده می شود،به مقایسه های بیشتری‬ ‫نیاز داریم و هنگامی که امکان پذیر بودن ‪ K‬چک می شود،‬ ‫به مقا یسه های بیشتری نیاز است. عمل اصلی مقایسه‬ ‫است.‬ ‫اندازه ورودی : ‪ ، n‬تعداد کارها.‬ ‫²‪W )n(Є θ) )n‬‬ ‫قضیه 4-4‬ ‫الگوریتم 4-4 ( زمان بندی با مهلت‬ ‫معین ) همواره یک مجموعه بهینه تولید‬ ‫می کند.‬ ‫اثبات: ازطریق استقرا روی تعداد کارها،‪،n‬صورت‬ ‫می پذیرد.‬ ‫پذیرد‬ ‫مبنای استقرا: اگر یک کار داشته باشیم ، قضیه بر‬ ‫قراراست.‬ ‫قضیه 5-4‬ ‫الگوریتم هافمن یک کد دودویی بهینه‬ ‫تولید می کند.‬ ‫اثبات : ازطریق استقرا صورت می گیرد. با این‬ ‫فرض که درخت های به دست آمده درمرحله ‪،i‬‬ ‫انشعاب هایی در درخت دودویی متناظر با کد بهینه‬ ‫اند، نشان می دهیم که درخت های بدست آمده در‬ ‫مرحله (( 1 + ‪ i‬نیز انشعاب هایی در درخت دودویی‬ ‫متناظر با یک کد بهینه اند.‬ ‫فصل پنجم:‬ ‫راهبرد عقبگرد‬ ‫از تکنیک عقبگرد برای حل مسائلی استفاده‬ ‫می شود که در آن ها دنباله ای از اشیاء از یک‬ ‫مجموعه مشخص انتخاب می شود، به طوری‬ ‫که این دنباله ، مل کی را در بر می گیرد.‬ ‫یک مثال کلسیک از عقبگرد، مسئله ‪ n‬وزیر‬ ‫وزیر‬ ‫است.‬ ‫‪‬‬ ‫‪‬‬ ‫هدف از مسئله ‪ n‬وزیر ، چیدن ‪ n‬مهره وزیر در‬ ‫یک صفحه شطرنج است ، به طوری که هیچ دو‬ ‫وزیری یکدیگر را گارد ندهند. یعنی هیچ دو مهره‬ ‫ای نباید در یک سطر، ستون یا قطر یکسان‬ ‫باشند.‬ ‫‪‬‬ ‫عقبگرد حالت اصلح شده ی جست و جوی‬ ‫عمقی یک درخت است.‬ ‫الگوریتم عقبگرد همانند جست و جوی عمقی‬ ‫است، با این تفاوت که فرزندان یک گر فقط‬ ‫هنگامی ملقات می شوند که گره امید بخش‬ ‫باشدو در آن گره حلی وجود نداشته باشد.‬ ‫‪‬‬ ‫‪‬‬ n ‫الگوریتم 1-5: الگوریتم عقبگرد برای مسئله‬ ‫وزیر‬ ‫وزیر‬ voidqueens ) index) i } index; j index if))) promising)i if)) i == n cout;[>> col [1] through col [n else else for ) j = 1 ; j≥} ) ++ n ; j ;col [ i +1 ] = j ;col ;)queens ) i + 1 ;)queens { { bool promising )index) i } index; k index bool; switch ;k = 1 ;k ; switch = true switch while} ) ) k > i && switch if))col [i] == col[k] || abs)col[i] – col[k] == i-k ;switch = false ;switch ;++k ;++k { return; switch return { ‫3-5 استفاده از الگوریتم مونت کارلو برای‬ ‫برآورد کردن کارایی یک‬ ‫الگوریتم عقبگرد‬ ‫الگوریتم های مونت کارلو ، احتمالی هستند،‬ ‫یعنی دستور اجرایی بعدی گاه به طور تصادفی‬ ‫تعیین می شوند.‬ ‫در الگوریتم قطعی چنین چیزی رخ نمی دهد.‬ ‫همه ی الگوریتم هایی که تا کنون بحث شدند،‬ ‫قطعی هستند.‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم مونت کارلو مقدار مورد انتظار یک‬ ‫متغیر تصادفی را که روی یک فضای ساده‬ ‫تعریف می ود ، با استفاده از مقدار میانگین آن‬ ‫روی نمونه تصادفی از فضای ساده بر آورد می‬ ‫کند.‬ ‫‪‬‬ ‫‪ ‬تضمینی وجود ندارد که این برآورد به مقدار‬ ‫مورد انتظار‬ ‫واقعی نزدیک باشد، ولی احتمال نزدیک شدن آن،‬ ‫با افزایش زمان در دسترس برای الگوریتم،‬ ‫افزایش می یابد.‬ ‫الگوریتم2-5 : برآورد مونت کارلو‬ ‫الگوریتم‬ int)( estimate } node; v node int; m, mprod , numnodes int ;v = root of state space tree ;v ;numnodes = 1 ;numnodes ;m = 1 ;m ;mprod = 1 ;mprod while} ) ) m != 0 while ; t = number of children of v number ;mprod - mprod * m ;mprod ;numnodes = numnodes + mprod * t ;numnodes ;m = number of promising children of v ;m if) ) m != 0 if v = randomly selected promising randomly ; child of v child { return; numnodes return { ‫الگوریتم 3-5: بر آورد مونت کارلو برای الگوریتم‬ ‫1-5 (الگوریتم‬ )‫ وزیر‬n‫عقبگرد برای مسئله‬ ‫وزیر‬ intostimate _ n_ queens )int) n } index;[ i , j , col [1..n index int; m , mprod , numnodes int set _of_ index; prom _children set ;ii = 0 ; ; numnodes =1 numnodes ;m = 1 ;m ; mprod = 1 mprod while ) m != 0&&} ) i != n while ; mprod = mprod * m mprod ;numnodes = numnodes + mprod * n ;numnodes ;++ i ;++ ;m=0 ;prom_childern = Ø ;prom_childern for ) j = 1 ; j≥} );++ n ; j for ; col [i] = j col if} ))) promising)i ;++m ;++m ;{prom_children = prom _ children U {i ;{prom_children { { if} ) ) m != 0 if _ j = random selection from prom random ; children children ;[col [i ;[col { { return; numnodes return { ‫مسئله : تعیین همه ی ترکیبات اعداد صحیح موجود در یک‬ ‫مجموعه ‪ n‬عدد صحیح ، به طوری که حاصل جمع آن ها‬ ‫مساوی مقدار معین ‪ W‬شود.‬ ‫شود‬ ‫الگوریتم 4-5: الگوریتم عقبگرد برای مسئله‬ ‫حاصل جمع زیر‬ ‫مجموعه ها‬ ‫‪void sum _of _subsets ) index, i‬‬ ‫‪void‬‬ ‫‪int weight ,int) total‬‬ ‫‪int‬‬ ‫}‬ ‫‪if)))promising)i‬‬ ‫‪if) ) weight == W‬‬ ‫‪;[cout >> include [1] through include [i‬‬ ‫‪} else‬‬ ‫‪else‬‬ ; ”include [i +1] = ”yes ”include ,[sum_ of_subsets ) i +1 , weight + w [i +1 ,[sum_ ;)[ total – w [ i + 1 ;)[ { { bool;) promising ) index i bool } return )weight + total ≤ W(&&|| ) weight == W return ;) weight + w [ i + 1 ] ≥ W ;) { ‫5-5 رنگ آمیزی گراف‬ ‫مسئله رنگ آمیزی ‪ ، m‬عبارت از یافتن همه ی‬ ‫راه ها ی ممکن برای رنگ آمیزی یک گراف‬ ‫بدون جهت ، با استفاده از حداکثر ‪ m‬رنگ‬ ‫رنگ‬ ‫متفاوت است، به طوری که هیچ دو راس‬ ‫مجاوری هم رنگ نباشند.‬ ‫‪‬‬ ‫الگوریتم5-5: الگوریتم عقبگرد برای مسئله رنگ‬ ‫الگوریتم‬ m ‫آمیزی‬ void m_coloring )index) i void } int; color if))) promising )i if)) i == n cout ;[>> vcolor[1] through vcolor [n else else for} )++ )color = 1; color ≥ m; color for ; vcolor [ i + 1] = color vcolor ;)m_coloring )i + 1 ;)m_coloring { { bool promising )index) i bool } index; j index ; bool switch bool ;switch = true ;switch ;j = 1 while ) j > i&&} ) switch while if ) W [i] [j] &&)[vcolor [i] == vcolor[j ; switch = false switch ;++ j ;++ { return; switch return { ‫الگوریتم 6-5: الگوریتم عقبگرد برای مسئله‬ ‫مدارهای ها میلتونی‬ ‫میلتونی‬ void hamiltonian )index) i } index; j index if) ) promising )i if if) ) i == n - 1 if ;[cout >> vindex [0] through vindex [ n-1 ;[cout else } )++ for ) j = 2 ; j ≥ n ; j )++ ; vindex [ i +1] = j vindex ;) hamiltonian ) i +1 ;) { { bool promising ) index) i bool } index; j bool; switch bool if ) i == n -1&&!)[[ W [vindex [ n-1 ]] [ vindex [0 if ; switch = false } else else ; switch = true switch ;jj = 1 ; while} ) ) j > i && switch if)[)vindex [i] == vindex [j ; switch = false switch ;++j ;++j { { return;switch { ‫7-5 مسئله کوله پشتی صفر و یک‬ ‫در این مسئله مجمو عه ای از قطعات داریم که‬ ‫هر یک دارای وزن و ارزش معین است.‬ ‫اوزان و ارزش ها اعداد مثبتی هستند.‬ ‫‪‬‬ ‫‪‬‬ ‫دزدی درنظر دارد قطعاتی که می دزدد درون‬ ‫یک کوله پشتی قرار دهد و اگر وزن کل‬ ‫قطعات قرار داده شده در آن کوله پشتی از‬ ‫یک عدد صحیح مثبت‪ W‬فراتر رود،‬ ‫کوله پشتی پاره می شود.‬ ‫‪‬‬ ‫الگوریتم 7-5:الگوریتم عقبگرد برای مسئله کوله‬ ‫پشتی صفر و یک‬ void knapsack ) index, i void int profit ,int) weight } if ) weight ≥ W &&} ) profit < maxprofit ; maxprofit = profit maxprofit ; numbest = i numbest ;bestset = include ;bestset { if} ))) promising )i ;”include [ i + 1 ] = ”yes ;”include + knapsack ) i + 1, profit + p [ i + 1] , weight knapsack ;)[ w [ i +1 ;)[ ;”include [ i +1] = ” no ;”include ;) knapsachk ) i +1 , profit , weight ;) { { bool promising )index ) i bool } index; j , k index ; int totweight int ;float bound ;float if)) weight ≤ W return; false } ; j = i +1 +1 ; bound = profit bound ; totweight = weight totweight while ) j >= n&&} ) totweight + w[j] >= W ;[totweight = totweight + W [j ;[totweight ;[bound = bound + p[j ;[bound ;++j ;++j { ;k = j ;k if)) k >= n ;[bound = bound + )W – totweight( * p [k]/w[k ;[bound return; bound < max profit { { ‫7-5-2 مقایسه الگوریتم برنامه نویسی پویا‬ ‫و الگوریتم عقبگرد برای مسئله کوله‬ ‫پشتی صفر و یک‬ ‫تعداد عناصری که توسط الگوریتم برنامه‬ ‫نویسی پویا برای مسئله کوله پشتی صفر و یک‬ ‫محاسبه می شود دربدترین حالت به ‪O‬‬ ‫‪ (((minimum (2ⁿ , nW‬تعلق دارد.‬ ‫در بدترین حالت ، الگوریتم عقبگرد )‪ ⁿ 2)θ‬گره‬ ‫گره‬ ‫را چک می کند.‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم عقبگرد معمول کارایی بیشتری نسبت‬ ‫به لگوریتم برنامه نویسی پویا دارد.‬ ‫هوروویتز و شانی ، روش تقسیم و حل را با‬ ‫روش برنامه نویسی پویا ترکیب کرده‬ ‫الگوریتمی برای مسئله کوله پشتی صفر و یک‬ ‫بسط داده اند که دربدترین حالت به 2/‪(O(2^n‬‬ ‫تعلق دارد.‬ ‫‪‬‬ ‫‪‬‬ ‫فصل ششم:‬ ‫راهبرد شاخه و حد‬ ‫راهبرد شاخه و حد ازآن لحاظ به عقبگرد شبا‬ ‫هت دارد که‬ ‫درآن، بریا حل مسئله از درخت فضای حالت‬ ‫استفاده می شود.‬ ‫تفاوت این روش با عقبگرد، اول ما را به‬ ‫پیمایش خاصی ازدرخت محدود نمی کندوثانیا‬ ‫فقط برای مسائل بهینه سازی به کار می رود.‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم شاخه و حد ، در هر گره عددی را‬ ‫) حدی ( رامحاسبه می کند تاتعیین شود که آیا‬ ‫این گره امید بخش هست یا خیر.‬ ‫اگر آن حد بهتر از مقدار بهترین حلی که تاکنون‬ ‫یافته شده ، نباشد، گره غیر امید بخش است.‬ ‫در غیر این صورت ، امید بخش است.‬ ‫‪‬‬ ‫‪‬‬ ‫علوه براستفاده از حد، می توان حدود گره‬ ‫های امید بخش را مقایسه کرد و فرزندان‬ ‫گرهی با بهترین حد را ملقات نمود.بدین ترتیب‬ ‫می توان سریع تر از آن که گره ها را در یک‬ ‫ترتیب از پیش تعیین شده ملحظه کرد، به حل‬ ‫بهینه دست یافت.‬ ‫‪‬‬ ‫این روش را بهترین جست و جو با هرس‬ ‫کردن شاخه و حد می گویند.‬ ‫پیاده سازی این روش، شکل اصلح شده ی‬ ‫ساده ای از یک روش دیگر موسوم به جست‬ ‫و جوی عرضی هرس کردن شاخه و حد است.‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم 1-6: الگوریتم جست و جوی عرضی با‬ ‫هرس کردن شاخه‬ ‫و حد برای مسئله کوله پشتی صفر و یک‬ void knapsack ) int, n const int p [ ] ,const int,[ ] w const int, W int int &) maxprofit int } queue _of _ node; Q queue node; u , v ;)intialize )Q ;)intialize ; v.level = 0 ; v.profit = 0 ; v.weight = 0 v.level ; maxprofit = 0 maxprofit ;)enqueue )Q , v ;)enqueue while} )) )!empty )Q while ;) dequeue ) Q , v ;) ;u.level = v.level + 1 ;u.level ;[u.weight = v. weight + w [ u.level ;[u.weight ;[u. profit = v.profit + p [ u.level ;[u. if) ) u.weight >= W && u.profit < maxprofit if ;maxprofit = u.profit if) ) bound )u( < maxprofit if ; )enqueue )Q, u )enqueue ;u.weight = v. weight ;u.weight ;u. profit = v.profit ;u. if) ) bound )u( < maxprofit ;)enqueue )Q , u ;)enqueue { { )float bound ) node u )float { index; j, k index int; totweight float; result float if)) u.weight <= W return; 0 return } else else ;result = u.profit ;result ;jj = u.level + 1 ; ;totweight = u.weight ;totweight while) j >= n &&} ) totweight +w [j] >= W while ;[totweight = totweight + w [j ;[totweight ;[result = result + p [j ;[result ;++j ;++j { ;k=j if) ) k >= n if ;[result = result +) W – totweight ( * p [k] / w [k ;[result return; result return { { ‫الگوریتم 2-6: بهترین جست و جو با هرس کردن‬ ‫شاخه و حد برای مسئله کوله پشتی صفر و یک‬ void knapsack )int, n void const int p [ ] ,const int,[ ] w const int, W int int) & maxproit int } priority _ queue_of _node; PQ priority node; u , v node ; )initialize )PQ )initialize ; v.level = 0 ; v.profit = 0 ; v.weight = 0 v.level ; maxprofit = 0 maxprofit ;)v.bound = bound )v ;)v.bound ;)insert )PQ , v ;)insert while} )))! Empty)PQ ;)remove )PQ , v ;)remove if} ) ) v.bound < maxprofit if ;u.level = v.level + 1 ;u.level ;[ u.weight = v.weight + w [ u.level ;[ ; [ u. profit = v.profit + p [ u.level u. if) ) u.weight >= W && u.profit < maxprofit ;maxprofit = u.profit ;maxprofit ;)u.bound = bound )u ;)u.bound if) ) u.bound < maxprofit ;)insert )PQ , u ;)insert ; u.weight = v.weight u.weight ; u. profit = v.profit u. ; )u.bound = bound )u )u.bound if ) ) u.bound < maxprofit ;) insert )PQ >u ;) { { { ‫6-2 مسئله فروشنده دوره گرد‬ ‫هدف از این مسئله یافتن کوتاهترین مسیر در‬ ‫یک گراف جهت دار با شروع از یک راس‬ ‫مفروض است ، مشروط بر آن که هر راس‬ ‫فقط یک با ر ملقات شود. چنین مسیری را یک‬ ‫تور می گویند.‬ ‫‪‬‬ ‫الگوریتم 3-6: الگوریتم بهترین جستجو با هرس‬ ‫کردن شاخه و حد برای مسئله فروشنده دوره‬ ‫گرد‬ void,travel2 ) int n const number, [ ] [ ] W const ordered-set &, opttour ordered-set number &) minlength number } priority _ queue _ of _ node; PQ priority node; u , v node ; ) initialize ) PQ initialize ; v.level = 0 v.level ;[v.path = [1 ;[v.path ; )v.bound = bound )v )v.bound ; ∞ = minlength minlength ; ) insert )PQ , v insert while} )) ) ! Empty )PQ while ;) remove) PQ, v ;) if} ) ) v.bound > minlength ;u.level = v.level + 1 ;u.level for}) )all i such that 2 ≥ i ≥ n && i is not in v.path for ; u.path = v.path u.path ;put i at the end of u.path ;put if} ) ) u.level == n – 2 put index of only vertex put ;put in u.path at the end of path ;put ;put 1 at the end of u.path ;put if} ) ) length )u( > minlength ;)minlength = length )u ;)minlength ; opttour = u.path opttour { { } else else ;)u.bound = bound )u ;)u.bound if) ) u.bound > minlength if ;) insert )PQ , u ;) { { { { ‫3-2استنباط فرضیه ای ) تشخیص بیماری (‬ ‫3-2‬ ‫یک مسئله مهم د رهوش مصنوعی و سیستم‬ ‫های خبره، تعیین محتمل ترین توضیح برای‬ ‫برخی یا فته ها است.‬ ‫برا ی مثال، در پزشکی می خواهیم محتمل‬ ‫ترین مجموعه از بیماری ها را که از یک سری‬ ‫علئم قابل نتیجه گیری است ، تعیین کنیم.‬ ‫‪‬‬ ‫‪‬‬ ‫فرایند تعیین محتمل ترین توضیح برای یک‬ ‫مجموعه یافته ها را استنباط از طریق‬ ‫فرضیه می نا میم.‬ ‫شبکه باور استانداردی برای نشان دادن‬ ‫روابط احتمالی ، نظیر روابط میان بیماری و‬ ‫نشا نه ها به شمار می رود.‬ ‫‪‬‬ ‫‪‬‬ ‫الگوریتم 4-6 : الگوریتم بهترین جست و جو با‬ ‫هرس کردن شاخه و حد برای استنباط فرضیه‬ )‫ای ( الگوریتم کوپر‬ void cooper )int, n void Bayesian_network_of_n_diseases BN, set _ of _symptoms, S set set_ of _indices & best ,float &) pbest set_ } priority_queue_of_node; PQ priority_queue_of_node node; u , v node ; v.level = 0 v.level ; v.D = Ø v.D ; best = Ø best ;) pbest = p )Ø | S ;) ;)v.bound = bound )v ;)v.bound ;) insert )PQ , v ;) while} )) ) ! Empty )PQ while ;)remove )PQ , v ;)remove if} ) ) v.bound < pbest if ;u.level = v.level + 1 ;u.level ;u.D = v.D ;put u.level in u.D ;put if} ) ) p ) u.D | S ( < pbest if ;best = u.D ;best ;) pbest = p ) u.D | S ;) { ;)u.bound = bound)u ;)u.bound if) ) u.bouond < pbest if ;)insert )PQ, u ;)insert ;u.D = v.D ;u.D ;)u.bound = bound )u ;)u.bound if ) ) u.bound < pbest ;) insert )PQ , u ;) { { { intbound ) node) u } if) )u.level == n return; 0 else return;)p)u.D | p )S { ‫فصل هفتم:‬ ‫مقدمه ای بر پیچیدگی محاسباتی:‬ ‫مسئله مرتب سازی‬ ‫1- 7 پیچیدگی محاسباتی‬ ‫پیچیدگی محاسباتی عبارت از مطالعه تمام‬ ‫الگوهای امکن پذیر برای حل یک مسئله‬ ‫مفروض است.‬ ‫در تحلیل پیچیدگی محاسباتی کوشش می کنیم‬ ‫تا حد پایینی کارایی همه ی الگوریتم ها را برای‬ ‫یک مسئله مفروض به دست آوریم.‬ ‫‪‬‬ ‫‪‬‬ ‫‪ ‬تحلیل پیچیدگی محاسباتی را با مطالعه مسئله‬ ‫مرتب سازی‬ ‫معرفی می کنیم.‬ ‫‪ ‬این انتخاب دو دلیل دارد:‬ ‫1- چند الگوریتم ابداع شده اند که که مسئله را‬ ‫حل می کنند.‬ ‫2- مسئله مرتب سازی یکی از معدود مسائلی‬ ‫است که در بسط الگوریتم هایی با پیچیدگی‬ ‫زمانی نزدیک به حد پایینی برای آن موفق بوده‬ ‫ایم.‬ ‫7-2 مرتب سازی درجی و مرتب سازی‬ ‫انتخابی‬ ‫الگوریتم مرتب سازی درجی الگوریتمی اس که‬ ‫مرتب سازی را با درج رکوردها در یک آرایه‬ ‫مرتب شده ی موجود مرتب سازی می کند.‬ ‫‪‬‬ ‫الگوریتم 1-7: مرتب سازی درجی‬ voidinsertionsort ) int n , keytype) [ ] S } index; i , j index keytype; x for} )++ ) i = 2 ; i >= n ; i for ;[x = S [i ;[x ;jj = i + 1 ; while} ) ) j <0 && S [i] < x while ;[S [ j + 1 ] = S [j ;[S ;--j { ;S[j+1]=x { { ‫تحلیل پیچیدگی زمانی تعداد مقایسه های کلید ها درا‬ ‫لگوریتم مرتب سازی درجی‬ ‫در بدترین حالت‬ ‫عمل اصلی : مقایسه ‪ [S [ j‬با ‪. x‬‬ ‫اندازه ورودی : ‪ ، n‬تعداد کلید هایی که باید مرتب‬ ‫شوند.‬ ‫2 / (1 - ‪W )n( = n) n‬‬ ‫تحلیل پیچیدگی زمانی تعداد مقایسه های کلید ها درا‬ ‫لگوریتم مرتب سازی درجی‬ ‫در حالت میانگین‬ ‫عمل اصلی : مقایسه ‪ [S [ j‬با ‪. x‬‬ ‫اندازه ورودی : ‪ ، n‬تعداد کلید هایی که باید مرتب‬ ‫شوند.‬ ‫4 / ²‪A )n( = n‬‬ ‫(‪)n‬‬ ‫تحلیل استفاده از فضای اضافی برای الگوریتم 1-7 )‬ ‫مرتب سازی درجی(‬ ‫تنها فضایی که با ‪ n‬افزایش می یابد، اندازه ی‬ ‫آرایه ورودی‪ S‬است. پس ،این الگوریتم یک‬ ‫است‬ ‫مرتب سازی درجا است و فضای اضافی به)1(‬ ‫‪ θ‬تعلق دارد.‬ ‫‪‬‬ ‫جدول 1- 7 : خلصه تحلیل مرتب سازی تعویضی ، درجی‬ ‫و انتخابی‬ ‫استفاده‬ ‫ازفضای‬ ‫اضافی‬ ‫درجا‬ ‫درجا‬ ‫درجا‬ ‫الگوریت مقایسه‬ ‫کلید‬ ‫م‬ ‫2 / ²‪W )n( = 3 n²/ 2 T (n) = n‬‬ ‫2 /²‪A )n( = 3 n‬‬ ‫تعویض‬ ‫ی‬ ‫2 / ²‪W (n) = n² / 2 W(n) = n‬‬ ‫درجی 4 / ²‪A (n) = n² / 4 A (n) = n‬‬ ‫‪T (n)= 3n‬‬ ‫2 / ²‪T (n) = n‬‬ ‫انتخاب‬ ‫انتساب رکورد‬ ‫ها‬ ‫الگوریتم 2-7: مرتب سازی انتخابی‬ void selectionsort )int n ,keytype) [ ] S void } index; i , j , smallest index for) ++ ) i = 1; i >= n-1 ; i for if)[ ) S [j] > S [ smallest if ; smallest = j smallest ; [ exchange S [i] and S [smsllest exchange { { ‫قضیه 1-7‬ ‫‪ ‬هر الگوریتمی که ‪ n‬کلید متمایز را فقط از‬ ‫طریق مقایسه کلید ها انجام دهد و پس از هر‬ ‫بار مقایسه ، حد اکثر یک وارونگی را حذف‬ ‫کنید، باید در بدترین حالت حداقل‬ ‫4/ )1 -‪ n( n‬مقایسه روی کلید ها انجام دهد.‬ ‫الگوریتم مرتب سازی تعویضی‬ void exchangesort ) int n ,keytype) [ ] S } index; i , j index for) ++ ) i = 1 ; i >= n -1 ; i for if) [ ) S [j] > S [i ;[exchange S [i] and S [j ;[exchange { ‫7-4 نگاهی دوباره به مرتب سازی ادغامی‬ ‫پیچیدگی زمانی تعداد مقایسه های کلید ها در‬ ‫مرتب سازی ادغامی در بدترین حالت، وقتی که‬ ‫‪ n‬توانی از 2 است، به طور کلی به ‪θ((n lg n‬‬ ‫تعلق دارد:‬ ‫‪‬‬ ‫1 – ‪) W )n( = n lg n – ) n‬‬ ‫(‪)n‬‬ ‫پیچیدگی زمانی تعداد مقایسه های رکورد ها در‬ ‫مرتب سازی ادغامی در حالت معمول تقریبا به‬ ‫صورت زیر است:‬ ‫‪‬‬ ‫‪T ) n( = 2n lg n‬‬ ‫(‪n‬‬ ‫بهبود بخشیدن به مرتب سازی ادغامی‬ ‫‪ ‬می توانیم مرتب سازی ادغامی را به سه شیوه‬ ‫بهبود ببخشیم:‬ ‫1- نسخه ای ازمرتب سازی ادغامی به روش‬ ‫برنامه نویسی پویا‬ ‫2- نسخه پیوندی‬ ‫3- الگوریتم ادغامی پیچیده تر‬ ‫الگوریتم 3-7: مرتب سازی ادغامی 3 ) نسخه‬ (‫برنامه نویسی پویا‬ voidmergesort ) int n, keytype) [ ] S } int; m int index; low , mid , high , size index ; [m = 2 ^ [ lg n [m ; size = 1 size } ) repeat )lgmtimes repeat for; ) low = 1; low >= m -2 * size + 1 } ) low = low + 2 * size low ; mid = low + size -1 mid ;) high = minimun ) low + 2 * size – 1 , n ;) ;) merge3 ) low , mid , high , S ;) { ; size = 2 * size size { { ‫الگوریتم 4-7 : مرتب سازی ادغامی 4 ) نسخه‬ (‫پیوندی‬ void mergesort4)int low,indexhigh, index&)mergedlist index& } ;index mid , list 1 , list 2 ;index } ) if ) low == high if ; mergedlist = low mergedlist ; S [ mergedlist ].link = 0 mergedlist { } else else ;⌡mid = Į )low + high ( / 2 ;⌡mid ;) 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 ;mergedlist ;list1 = S [list 2 ].link { } else else ;mergedlist = list 2 ;mergedlist ;list 2 = S [list 2 ] .link ;list { ;lastsorted = mergedlist ;lastsorted while ) list1 != 0&&) list2 != 0 while if} S [list 1].key > S [list 2].key if ; S [ lastsorted ].link = list 1 lastsorted ;lastsorted = list1 ;lastsorted ;list 1 = S [ list 1] .link ;list { } else else ; S [ lastsorted ].link = list 2 lastsorted ;lastsorted = list2 ;lastsorted ;list 2 = S [ list 2] .link ;list { if) ) list 1 ==0 if ; S [ lastsorted ].link = list 2 lastsorted else ; S [ lastsorted ] .link = list 1 lastsorted { ‫تحلیل استفاده از فضای اضافی برای الگوریتم 4-‬ ‫7)مرتب سازی ادغامی 4(‬ ‫در هر حالت استفاده از فضای اضافی به))‪θn‬‬ ‫پیوند تعلق دارد.‬ ‫منظور از ))‪ θn‬پیونداین است که تعداد پیوند ها‬ ‫به ))‪θn‬‬ ‫تعلق دارد.‬ ‫‪‬‬ ‫‪‬‬ ‫7-5 نگاهی دوباره به مرتب سازی سریع‬ void quicksort ) index low ,index) high void } ; index pivotpoint index if} ) ) high < low ; ) partition ) low , high , pivotpoint partition ;)quicksort ) low , high , pivotpoint – 1 ;)quicksort ;) quicksort )pivotpoint + 1 , high ;) { { ‫روش های بهبود بخشیدن به الگوریتم مرتب‬ ‫سازی سریع‬ ‫‪ ‬استفاده از فضای اضافی در مرتب سازی‬ ‫سریع را می توان به پنج شیوه کاهش داد:‬ ‫1- در روال ‪ ، quicksort‬تعیین می کنیم کدام زیر‬ ‫آرایه کوچک تراست و همواره آن را در پشته‬ ‫قرار می دهیم و دیگری را نگه می داریم.‬ ‫در این نسخه استفاده از فضای اضافی در بد‬ ‫ترین حالت به ))‪ θlg n‬اندیس تعلق دارد.‬ ‫‪lg‬‬ ‫‪‬‬ ‫2- نسخه ای از ‪ partition‬وجود دارد که تعداد‬ ‫انتساب های رکورد ها را به طرزی چشمگیر‬ ‫کاهش می دهد.‬ ‫برای این نسخه، پیچیدگی زمانی تعداد‬ ‫انتساب های انجام شده توسط مرتب سازی‬ ‫سریع در حالت میانگین عبارت است از:‬ ‫‪A (n) = 0.69 ( n + 1 ) lg n‬‬ ‫‪‬‬ ‫3- مقدار زیادی از اعمال ‪ pop‬و ‪ push‬بی مورد‬ ‫است.‬ ‫می توانیم با نوشتن ‪ quicksort‬به شیوه تکرار‬ ‫و‬ ‫دستکاری پشته در روال، ازعملیات بیهوده‬ ‫پرهیز کنیم،‬ ‫یعنی به جای استفاده از پشته و بازگشتی ،‬ ‫پشته را‬ ‫خودمان می سازیم.‬ ‫4- الگوریتم های بازگشتی مثل مرتب سازی‬ ‫سریع را می توان با تعیین یک مقدار آستانه که‬ ‫در آن الگوریتم به جای تقسیم بیشتر نمونه ،‬ ‫یک الگوریتم تکراری را فراخوانی می کند ،‬ ‫بهبود بخشید.‬ ‫5- انتخاب میانه 2/) ‪، ⌡S [low[ ، S [Į low + high‬‬ ‫‪ [S [high‬برای نقطه ی محوری است.‬ ‫‪[S‬‬ ‫7-6 مرتب سازی ‪heap‬‬ ‫درخت دودویی کامل یک درخت دودویی است‬ ‫که واجد شرایط زیر باشد:‬ ‫همه ی گره های داخلی دو فرزند داشته باشند.‬ ‫همه ی برگ ها دا رای عمق ‪ d‬باشند.‬ ‫باشند‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫درخت دودویی اساسا کامل یک درخت دودویی‬ ‫است که:‬ ‫تا عمق )1 – ‪ (n‬یک درخت دودویی کامل باشد.‬ ‫‪(n‬‬ ‫گره هایی با عمق ‪ d‬تا حد امکان در طرف چپ‬ ‫واقع شوند.‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ ‫‪ heap‬یک درخت دودویی اساس کامل است به‬ ‫‪heap‬‬ ‫طوری که:‬ ‫مقادیر نگهداری شده در گره های آن از یک‬ ‫مجموعه مرتب باشند.‬ ‫مقادیر نگهداری شده درهر گره بزرگ تر یا‬ ‫مساوی مقادیر نگهداری شده در فرزندان آن‬ ‫باشد.‬ ‫‪‬‬ ‫‪‬‬ ‫‪‬‬ heap ‫7-6-2 پیاده سازی مرتب سازی‬ heap ‫ساختمان داده های‬ heap struct heap } ;[keytype S [1..n ;[keytype ; int heapsize int ;{ ;{ ) void siftdown ) heap& H , index i void } index; parent, largerchild; keytype siftkey index ;bool spotfound ;bool ;[siftkey = H.S[i ;[siftkey ;parent = i ; spotfound = false ;parent while} ( (2* parent >= H.hepsize &&! spotfound while if[ ( 2 * parent > H.heapsize && H.S [ 2*parent if ;largerchild = 2 * parent + 1 ;largerchild else else ; largerchild = 2 * parent largerchild if} ([ ( siftkey > H.S[largerchild if ;[ H.S [parent[ = H.S[largerchild ;[ ; parent = largerhild parent { else else ;spotfound = true ;spotfound { ;H.S[parent[ = siftkey ;H.S[parent[ { ; keytype keyout keytype ;[keyout = H.S [1 ;[keyout ;[H.S[1] = H.S[heapsize ;[H.S[1] ;H.heapsize = H.heapsize -1 ;H.heapsize ;) siftdown )H , 1 ;) return ; keyout return { void removekeys )int, n void heap& H heap& keytype) [ ] S keytype } index; i index for)-- ) i = n; i <= 1 ; i ;)S [i] = root )H ;)S { void makeheap ) int, n void )heap& H )heap& } index; i index ; H.heapsize = n H.heapsize for)-- ) i = Į n/2⌡; i <= 1 ; i for ;)siftdown )H,i ;)siftdown { heap ‫الگوریتم 5-7: مرتب سازی‬ void heapsort ) int n ,heap&) H void } ;) makeheap ) n, H ;) ;) removekeys ) n, H , H.S ;) { ‫7-7مقایسه مرتب سازی ادغامی، متب سازی سریع‬ ‫7-7‬ ‫ومرتب سازی ‪heap‬‬ ‫مرتب سازی سریع معمول بر مرتب سازی‬ ‫‪ heap‬ارجحیت دارد.‬ ‫مرتب سازی سریع معمول بر مرتب سازی‬ ‫ادغامی ترجیح داده می شود.‬ ‫‪‬‬ ‫‪‬‬ ‫1-8-1 درخت ها ی تصمیم گیری برای الگوهای‬ ‫مرتب سازی‬ ‫‪ ‬لم 1-7: متناظر با هر الگوریتم قطعی برای‬ ‫مرتب سازی ‪ n‬کلید متمایز، یک درخت تصمیم‬ ‫گیری دودویی ، معتبر و هرس شده با دقیقا ‪!n‬‬ ‫برگ وجود دارد.‬ ‫‪ ‬لم 2-7: تعداد مقایسه های انجام شده توسط‬ ‫یک درخت تصمیم گیری در بدترین حالت برابر‬ ‫با عمق درخت است.‬ ‫‪ ‬لم 3-7: اگر‪ m‬تعداد برگ ها در یک درخت‬ ‫دودویی و ‪d‬‬ ‫عمق آن باشد، داریم:‬ ‫‪┐ d ≤ ┌ lg m‬‬ ‫قضیه 2-7‬ ‫‪ ‬هر الگوریتم قطعی که ‪ n‬کلید متمایزرا‬ ‫فقط با مقایسه کلید ها مرتب سازی‬ ‫می کند، باید در بدترین حالت حد اقل‬ ‫┌ ‪ ┐ )!lg ) n‬مقایسه کلید ها راانجام دهد.‬ ‫‪ ‬لم 4-7: به ازای هر عدد مثبت و صحیح ‪،n‬‬ ‫داریم:‬ ‫‪lg )n!( ≤ n lg n – 1.45 n‬‬ ‫‪lg‬‬ ‫قضیه 3-7‬ ‫‪ ‬هر الگوریتم قطعی که ‪ n‬کلید متمایز را‬ ‫فقط با مقایسه ی‬ ‫کلید ها انجام می دهد باید در بدترین‬ ‫حالت حداقل‬ ‫┌ ‪ ┐n lg n – 1.45n‬مقایسه کلید ها را‬ ‫انجام دهد.‬ ‫7-8-3 حدود پایینی برای رفتار در حالت‬ ‫میانگین‬ ‫‪ ‬لم 5-7: متنا ظر با هر درخت تصمیم گیری‬ ‫دودویی معتبر هرس شده برای مرتب سازی ‪n‬‬ ‫کلید متمایز، یک درخت -2 تصمیم گیری معتبر‬ ‫هرس شده وجود دارد که حد اقل به اندازه‬ ‫درخت اول کارایی دارد.‬ ‫‪ ‬لم 6-7: هر الگوریتم قطعی که ‪ n‬کلید متمایز‬ ‫را فقط با مقایسه کلید ها مرتب سازی می‬ ‫کند، حد اقل تعداد محاسبه کلید های که انجام‬ ‫می دهد به طور میانگین برابر است با:‬ ‫‪!mimEPL )n!( / n‬‬ ‫‪ ‬لم 7-7: هر درخت دودویی-2 که دارای ‪m‬‬ ‫برگ باشد و‬ ‫‪EPL‬آن برابر ‪ )minEPL)m‬باشد، باید همه ی‬ ‫‪EPL‬‬ ‫برگ های آن در پایین ترین سطح باشند.‬ ‫‪ ‬لم 8-7: هر درخت -2 که دارای ‪ m‬برگ و‪Epl‬‬ ‫آن برابر‬ ‫‪ )minEPL)m‬باشد ، باید 2^‪ d – m‬برگ در سطح‬ ‫1–‪d‬‬ ‫و ‪ 2m – 2 ^d‬برگ درسطح ‪ d‬داشته باد و برگ‬ ‫دیگری‬ ‫نداشته باشد، ‪ d‬عمق درخت است.‬ ‫‪ ‬لم 9-7: به ازای هر درخت -2 که ‪ m‬برگ و‬ ‫‪ EPL‬آن برابربا‪ )minEPL)m‬باشد، عمق ‪d‬‬ ‫عبارت است از:‬ ‫‪┐ d = ┌ lg m‬‬ ‫‪ ‬لم 01-7: به ازای همه ی مقادیر 1 ≤ ‪m‬‬ ‫داریم :‬ ‫‪⌡mimEPL)M( ≤ m Į lg m‬‬ ‫قضیه 4-7‬ ‫هر الگوریتم قطعی که ‪ n‬کلید متمایزرا تنها با‬ ‫مقایسه کلیدها مرتب سازی کند، به طور‬ ‫میانگین باید حداقل این تعداد مقایسه ها را‬ ‫انجام دهد:‬ ‫‪n lg n – 1.45n⌡ Į‬‬ ‫‪‬‬ ‫7-9 مرتب سازی از طریق توزیع )مرب‬ (‫سازی مبنایی‬ ‫الگوریتم 6-7: مرتب سازی مبنایی‬ void radixsort )node_pointer& ; mastrrlist int) numdigits } index; i index node_pointer[ list [0..9 for } )++ ) i = 1 ; i >= numdigits ; i for ;)disteibute )i ;)disteibute ; coalesce coalesce { { void distrebute )index) i } index; j index node_pointer; p node_pointer for)++ ) j = 0 ; j >= 9 ; j for ;list [j] = NULL ;list ; p = masterlist masterlist while} ) ) p != NULL while ;jj = value of ith digit )from the right(in p -< key ; ;[link p to the end of list [j ;[link ; p = p -< link -< { { void)( coalesce void } index; j index ;masterlist = NULL ;masterlist for)++ ) j = 0 ; j >= 9 ; j for ;link the nodes in list [j] to the end of masterlist ;link { ‫با تشکر‬ ‫پایان‬ ...
View Full Document

This note was uploaded on 04/09/2010 for the course CS 12345 taught by Professor Thomas during the Spring '10 term at École Normale Supérieure.

Ask a homework question - tutors are online