Algorithm Design Niroomand
Algorithm Design Niroomand
اللَهُمَّ إنّي اَعوذُ بِکَ مِن عِلمٍ الیَنفَع (خداوندا! پناه ميبرم به تو از علمي که نفعي نداشته باشد)
طراحی الگوریتم
Algorithm Design
حمیدرضا نیرومند
http://niroomand.ir
فهرست
فصل اول :نقش الگوریتمها در پردازش 5 .............................................................................
2
-3-10نمادهای استاندارد و توابع عمومي 36 ........................................................................
-3-11یکنواختي 36 ..................................................................................................
-3-12باقیمانده 38 ....................................................................................................
فصل چهارم :الگوریتمهای بازگشتي 39 ...............................................................................
3
-7-3مسأله درخت پوشای کمینه 67 ...............................................................................
-7-1مسأله فروشنده دورهگرد 69 ..................................................................................
-7-2الگوریتم کراسکال 70 ........................................................................................
-7-3الگوریتم دکسترا 71 ...........................................................................................
فصل هشتم :تکنیکهای طراحي الگوریتم ( :)4الگوریتمهای عقبگرد 73 ..........................................
4
فصل اول
-انواع هدف:
( Purpose oمقصود) :به هدف غایي و نهایي از انجام یک کار گفته ميشود؛ مانند «برنده
شدن» در یک بازی فوتبال
( Goal oهدف) :به اهداف کوتاهمدتي که برای رسیدن به هدف نهایي تعریف ميشوند گفته
ميشود؛ مانند «گل زدن» در بازی فوتبال برای رسیدن به «برنده شدن»
( Objective oهدف عینی/مأموریت) :اهداف قابلمشاهده که برای رسیدن به Goalها
تعریف ميشوند؛ مثالً برای گل زدن «باید در تیم چینش مناسبي داشت».
( Policy oخط مشی) :سیاستهایي که باید برای رسیدن به اهداف برنامهریزی شوند؛ مانند
«تأمین بودجه تیم»« ،آنالیز کردن قدرت تیم مقابل» و...
1
Problem
2 Finite
3 Procedure
4 Well-defined
5 Set
5
ورودی 1ميگیرد و مقادیر یا مجموعهای از مقادیر را به عنوان خروجي 2تولید ميکند؛ بنابراین ميتواند گفت:
یک الگوریتم ،یک توالي 3از گامهای محاسباتي است که ورودی را به خروجي تبدیل ميکند.
ميتوان الگوریتم را ابزاری برای حل یک مسأله محاسباتي که جزئیات آن به خوبي بیان شده ،دانست ،و یا به
سادهترین بیان :راهي برای کشف رابطهی بین ورودی و خروجي!
مثال :فرض کنید ،قرار است تعدادی عدد را مرتب کنید« .مسألهی مرتبسازی به شکل زیر تعریف ميشود».
خروجي :توالي مرتب اعداد ورودی ) 𝑛 (𝑎′1 , 𝑎′2 , … , 𝑎′با این شرط که:
) 𝑛(𝑎′1 ≤ 𝑎′ 2 ≤ ⋯ ≤ 𝑎′
برای مثال ورودی )31, 41, 59, 26, 41, 58( :با توجه به الگوریتم مرتبسازی ،خروجي زیر را
برميگرداند:
به آن توالي ورودی در اصطالح یک «نمونه» 4از مسأله مرتبسازی گفته ميشود .در کل یک نمونه از یک
مسأله شامل ورودیهایي است که نیاز دارند راهحلِ5مسأله روی آنها اعمال شود.
6
از آنجا که بسیاری از برنامهها از مرتبسازی به عنوان گام میاني استفاده ميکنند ،الگوریتمهای مرتبسازی
یکي از عملیات پایهای و اساسي در علم کامپیوتر7هستند؛ بنابراین در این کتاب تعدادی الگوریتم مرتبسازیِ
خوب مورد بررسي قرار گرفته است.
اینکه کدام الگوریتمِ مرتبسازی برای یک کاربرد خاص مناسب است ،بستگي دارد به:
1 Input
2 Output
3 Sequence
4
Instance
5 Solution
6 Sorting Algorithms
7 Computer Science
6
.2آیتمهایي که از قبل مرتب شده بودهاند.
.3محدودیتهای 1احتمالي که روی آیتمها وجود دارد.
6
.4معماری 2کامپیوتر و نوع دستگاه ذخیرهسازی3که استفاده ميشود؛ مانند رَم4یا دیسک5یا نوار.
-الگوریتم صحیح:
به الگوریتمي که بهازای هر نمونه از ورودی ،یک خروجي صحیح در پایان7ارائه کند ،الگوریتم صحیح 8گفته
ميشود .در اصطالح گفته ميشود :یک الگوریتم صحیح ،مسأله محاسباتي مدنظر را «حل» 9ميکند .یک
11
الگوریتم ناصحیح ممکن است بهازای برخي ورودیها هیچ پاسخي10برنگرداند و یا یک پاسخ اشتباه
برگرداند .بر خالف آنچه انتظار دارید الگوریتمهای ناصحیح ميتوانند گاهي مفید واقع شوند ،البتّه اگر
نرخخطای12آنها را کنترل کنیم.
14
یک الگوریتم ميتواند به زبان انگلیسي یا در قالب یک برنامهی کامپیوتری13و یا حتي در قالب یک طراحي
سختافزاری15توصیف شده باشد .تنها محدودیت این است که توصیف16باید یک بیان دقیق از روال محاسباتي
که باید انجام شود ،ارائه کند.
1 Restrictions
2 Architecture
3 Storages Devices
4 Main Memory
5 Disk
6 Tape
7 Half
8 Correct
9 Solve
1 Answer 0
1 Incorrect 1
1 Error Rate 2
1 Computer Program 3
1 Design 4
1 Hardware 5
1 Specification 6
1 Human Genome Project 7
7
یک مسیر خوب بین Clientو Serverیک چالش دیگر به حساب ميآید که نیاز به
الگوریتمهای خاص خود دارد.
تجارت الکترونیک امکان ارائه کاال و خدمات به صورت الکترونیکي را فراهم کرده -1-6-3
است امّا چالشهایي مانند حفظ حریم خصوصي اشخاص (از قبیل شماره کارت اعتباری،
پسوردها و )...چالشي است که نیاز به الگوریتمهای خاص خود دارد.
شرکتهای تجاری مانند یک شرکت نفت (که نیاز به بهترین جا برای حفر چاه -1-6-4
دارد) ،برای یافتن بهترین راهحلها جهت کسب سود بیشتر با الگوریتمهای خاص خود درگیرند
و یا حتي یک کاندیدای انتخابات سیاسي نیاز دارد بداند در چه کمپینهایي بیشتر هزینه کند ،تا
شانس برنده شدن در انتخابات1را افزایش دهد.
مسائلي مانند یافتن کوتاهترین مسیر بین دو Nodeدر یک شبکه ،مسائل پرکاربردی -1-6-5
هستند که الگوریتمهای فراواني برای آنها ارائه شده است.
حتي مسأله سادهای مانند لیست کردن قطعات تشکیلدهندهی یک قطعه به شرط اینکه -1-6-6
هر قطعه فرزند ،خود از قطعات دیگری تشکیل شده باشد ،یک مسأله چالشي است که نیاز به
الگوریتمهای خاص خود دارد.
تکنیک: -1-4
هرچند این کتاب ميتواند مانند یک «کتاب آشپزی»3برای الگوریتمها مورد استفاده قرار بگیرد امّا ،بههرحال
ممکن است شما با مسألهای مواجه شوید که نميتوانید به راحتي یک الگوریتم از-پیش-منتشر-شده برای آن
پیدا کنید( .مانند بسیاری از مسائل و تمرینهای این کتاب).
1 Election
2 Data Structures
3 Cookbook
8
این کتاب به شما تکنیکهای طراحي و تحلیل الگوریتم (یعني ماهیگیری) را یاد ميدهد؛ بنابراین شما ميتوانید
الگوریتمهای دلخواه خود را توسعه داده و نشان دهید که پاسخ صحیحي برميگردانند و کارایي آنها را نیز
درک کنید.
1
مسائل سخت: -1-5
اکثر این کتاب دربارهی الگوریتمهای کارا 2است .معیار 3معمول ما برای کارایي« ،سرعت» 4است؛ یعني چقدر
طول ميکشد تا یک الگوریتم نتیجهاش را تولید کند.
-مسائل :NPCمسائلي هستند که هیچ راهحل کارایي برای آنها قابل تصور نیست .به این مسائل در
اصطالح NPCیا NP-Completeگفته ميشود.
-مسائل :NPدسته مسائلي هستند که نميتوان در یک زمان چندجملهای ،یک پاسخ قطعي برای آن پیدا
کرد ،امّا اگر یک پاسخ کاندید برای آنها ارائه شود ميتوان ،در یک زمان چندجملهای صحّت آن
پاسخ را تأیید یا رد نمود؛ مانند اینکه نميدانیم فرضاً با 10میلیون تومان پول چه شغلي راهاندازی کنیم
که به سوددهي بینجامد.
-مسائل 5:Pدسته مسائلي هستند که ميتوان در یک زمان چندجملهای ،برای آن یک راهحل قطعي پیدا
کرد.
تمرین: -1-6
-1دربارهی قانون مور تحقیق کنید.
-2یک مثال از دنیای واقعي بزنید که نیاز به مرتبسازی داشته باشد و یک مثال از دنیای واقعي که نیاز به
مسیر پوشا داشته باشد.
پاسخ :مانند دریافت حقوق بازنشستگان که بر اساس حروف الفبا مرتب شدهاند و یا مراحل پخت یک
غذا که حتماً باید به ترتیب انجام شوند.
مسیر پوشا هم مانند خرید کردن که ميتوان خرید لوازم را طوی انجام داد که ابتدا آنهایي که در یک
مسیر و به ترتیب هستند انجام شوند و بعد مابقي و یا مسافرت رفتن از یک شهر به شهر دیگر که ترتیب
1
Hard Problems
2 Efficient
3 Measure
4 Speed
5
Polynomial
9
در آن رعایت ميشود .و یا خرید ماهیانه پوشاک و مواد غذایي و یا پرداخت قبوض و ...که همه را
باید با یک مبلغ مشخص انجام و پوشش داد.
-3به جز سرعت چه معیار دیگری برای کارایي سراغ دارید که ممکن است شخص از آن در دنیای واقعي
استفاده کند.
پاسخ :هزینه ،کیفیّت ،فضا و مکان و...
-4یک ساختمان داده که قبالً با آن آشنا شدهاید انتخاب کنید و دربارهی نقاط قوّت و محدودیتهای آن
بحث کنید( .مثال :دربارهی ساختمان داده شئ1صحبت کنید)
پاسخ :مانند آرایهها ،پشته ،لیست پیوندی ،متغیر 2عددی ،متغیر رشتهای و ...
یادآوری:
ساختمان دادهای که در آن ،آخرین ورودی ،اولین خروجي است؛ مانند پشته
ساختمان دادهای که در آن ،اولین ورودی ،اولین خروجي است؛ مانند نوارکاسِت یا صف نانوایي
1 Object
2 Float
3 Approximately
10
1
پردازش موازی: -1-7
تا سالها ما روی افزایش سرعتِ کالک 2پردازشگر حساب ميکردیم امّا محدودیتهای فیزیکي 3باعث
ميشود این افزایش سرعت تا حد مشخصي ممکن باشد؛ برای مثال یکي از این محدودیتها این است که اگر
سرعت کالک بیش از حد افزایش پیدا کند ،دمای پردازشگر به حدی باال خواهد رفت که خطر ذوبشدن
قطعات را درپي دارد؛ بنابراین امروزه برای محاسبات سنگین بهجای افزایش سرعت کالک از چندین هسته 4در
پردازشگر استفاده ميشود .این حالت را ميتوان چند کامپیوتر در یک چیپِ 5واحد تصور کرد و در اصطالح
به آن «کامپیوتر موازی» 6گفته ميشود .برای اینکه از کامپیوترهای چند هستهای بهترین کارایي را استخراج
کنیم به الگوریتمهایي نیاز داریم که به آنها الگوریتمهای موازی یا الگوریتمهای چندرشتهای 7گفته ميشود و
در فصل 27در این زمینه بحث خواهد شد.
1
Parallelism
2 Clock
3 Physical Limitations
4 Core
5 Chip
6 Parallel Computer
7 Multithreaded Algorithms
8 Demonstrate
9 Complex
1 Implementation 0
1 1
Resource Bounded
1 Time Space 2
11
کارایی:1 -1-9
الگوریتمهای مختلفي که برای حل یک مسأله مشابه پیشنهاد ميشود ،معموالً در «کارایي» به شدّت با هم
متفاوتند .این تفاوتها زماني که سختافزارها و نرمافزارهای دیگر مورد استفاده برای اجرای آنها با هم متفاوت
باشد بیشتر نیز خواهد شد؛ به عنوان مثال ،در فصل 2ما دو الگوریتم برای مرتبسازی خواهیم دید که اولي به نام
«مرتبسازی درجي» 2شناخته ميشود که این الگوریتم زمان C1n2را برای مرتبسازی nآیتم نیاز داردC1( ،
عدد ثابتي است که وابسته به nنیست) که ميگوییم این الگوریتم با n2متناسب 3است ،دومین الگوریتم
«مرتبسازی ادغامي» 4است که زمان C2nlognدارد ( C2یک عدد ثابت غیر وابسته به nاست و منظور از
logn( log2n ،lognدر مبنای )2است) .مرتبسازی درجي معموالً عدد ثابت کمتری نسبت به مرتبسازی
ادغامي دارد (یعني C1 < C2است) .خواهیم دید که عدد ثابت ،تأثیر 5بسیار کمي روی زمان دارد؛ بنابراین
ميتوان زمان اجرای 6مرتبسازی درجي را nو زمان اجرای مرتبسازی ادغامي را lognتصور کرد .هرچند
مرتبسازی درجي در تعداد کم سریعتر عمل ميکند؛ برای مثال فرض کنید یک کامپیوتر قوی (کامپیوتر Aبا
قدرت پردازش 10میلیارد دستورالعمل در ثانیه )7الگوریتم مرتبسازی درجي را اجرا ميکند ،و یک کامپیوتر
ضعیفتر (کامپیوتر Bبا قدرت پردازش 10میلیون دستورالعمل در ثانیه) الگوریتم مرتبسازی ادغامي را اجرا
ميکند .هر دو قادر هستند 10میلیون عدد را مرتب کنند ،در این حالت خواهیم دید که کامپیوتر 1000 ،Aبرابر
سریعتر از کامپیوتر Bعمل خواهد کرد ،در حاليکه نميتوان از این نتیجه گرفت که الگوریتم مرتبسازی
درجي سریعتر از الگوریتم مرتبسازی ادغامي عمل ميکند.
8
الگوریتمها و دیگر فناوریها: -1-10
مثال باال نشان داد که ما باید الگوریتمها را مانند سختافزار کامپیوتر بهعنوان یک فناوری در نظر بگیریم.
همانطور که انتخاب یک سختافزار سریع در کارایي سیستم موثر است ،انتخاب الگوریتمهای کارا نیز در
کارایي سیستم تأثیر فراواني دارد .همانطور که پیشرفتهای سریع در دیگر فناوریهای مرتبط با کامپیوتر پیش
ميآید ،در الگوریتمها نیز پیشرفتهای سریع و مهمي به وجود ميآید.
ممکن است الزم باشد الگوریتمها را با توجه به دیگر فناوریهای پیشرفته مانند موارد زیر انتخاب کنیم:
1 Efficiency
2 Insertion Sort
3 Proportional
4 Merge Sort
5 Factor
6 Running Time
7 10 billion instructions per second
8 Algorithms and other Technologies
12
-1-15-1معماریهای پیشرفته کامپیوتر و تکنولوژیهای ساخت آنها
3
-1-15-2رابطهای کاربری گرافیکي 1با جلوههای 2زیبا و کاربری آسان
4
-1-15-3سیستمهای شيگرا
-1-15-4فناوریهای یکپارچه 5وب
-1-15-5شبکههای سریع (کابلي و بيسیم)
برای مثال یک سرویس تحت وب را تصور کنید که یک مسیر را بین دو نقطه یافته و به راننده پیشنهاد ميکند
این سرویس عالوه بر اینکه به الگوریتمهای خاصي برای یافتن کوتاهترین مسیر نیاز دارد با الگوریتمهای
دیگری برای «رِندِر کردن»(6آماده کردن خروجي نهایي) نقشه و تشخیص آدرسها و اماکن و دیگر الگوریتمها
درگیر است .داشتن یک الگوریتم پایه و تکنیکهای طراحي الگوریتم یکي از ویژگيهایي است که
برنامهنویس ماهر 7را در برنامهنویس تازهکار 8متمایز ميکند .امّا این ویژگي کافي نیست ،آشنایي با دیگر
فناوریها که با الگوریتمها درگیر است نیز برای یک برنامهنویس ماهر الزم است.
هرچند ممکن است شما کارهای خود را بدون دانستن الگوریتمها انجام دهید ،امّا داشتن یک پیشزمینهی
11
خوب 9دربارهی الگوریتمها باعث ميشود ،بهتر و بیشتر از قبل کار10انجام دهید .
تمرین: -1-11
-1یک مثال از یک برنامه کاربردی بزنید که نیاز به محتوای الگوریتمي در سطح اپیلیکیشن دارد و در
مورد الگوریتمهایي که در این زمینه مشکل خاص دارند ،بحث کنید.
پاسخ :مانند آپدیت کردن ساعت کنار ویندوز و یا نوع نمایش سهبُعدی پنجرهها در سطح اپلیکیشن
-2فرض کنید قرار است در یک ماشین مشابه الگوریتمهای درجي و ادغامي را اجرا کنیم و بهازای n
ورودی ،الگوریتمدرجي 8n2گام طي کند و الگوریتم ادغامي𝑛 .64nlogبرای چه مقادیری از n
الگوریتمهای درجي بهتر از الگوریتمهای ادغامي عمل ميکنند؟
13
-3کوچکترین عدد nدر الگوریتمي که زمان اجرای آن 100n2بار است ،و الگوریتمي که زمان
اجرای آن 2nاست چیست ،به شرطي که الگوریتم اول سریعتر از الگوریتم دوم عمل کند؟ (هر دو در
یک ماشین مشابه اجرا ميشوند).
پاسخ :به جای nاعداد 1و بیشتر را قرار دهید تا زماني که 100n2کوچکتر 2nاز شود .خواهیم
دید که زماني که nبرابر با 15باشد ،اولي 22500خواهد شد و دومي 32768اما اگر nرا 14بگیریم،
اولي 16600خواهد شد و دومي .16384پس کوچکترین ،nعدد که شرط مسأله را تأمین کند15 ،
خواهد بود.
14
فصل دوم
مقدمه: -2-1
این فصل شما را با چارچوبي که ما در کتاب استفاده خواهیم کرد ،آشنا ميکند تا یاد بگیرید چطور دربارهی
طراحي و تحلیل الگوریتمها بیندیشد:
اعدادی که قرار است مرتب کنیم به نام «کلید» 1نیز شناخته ميشوند .اعداد ورودی به شکل یک آرایهی n
عنصری به ما داده ميشوند.
در این کتاب ما الگوریتمها را در غالب برنامههایي که به شکل «شبهکد» 2نوشته شدهاند توصیف 3ميکنیم.
شبهکدها شبیه زبانهای ،C++ ،Cجاوا ،پایثون4و پاسکال هستند .اگر با یکي از این زبانها آشنا باشید با کمي
تالش ميتوانید شبهکدها را با آن زبان پیادهسازی کنید.
تفاوت شبهکد با کد واقعي 5این است که در شبهکد شفافترین روش به شکلي مختصر و مفید برای هر
الگوریتم بیان ميشود .تفاوت دیگر شبهکد با کد واقعي این است که شبهکد معموالً به چالشهای 6مهندسي
1 Key
2 Pseudo Code
3 Describe
4
Python
5 Real Code
6 Issues
15
نرمافزار 1چندان توجهي ندارد .چالشهایي مانند انتزاعدادهای 2،پیمانهای بودن «ماژوالریتي» 3و برخورد با
خطاها4اغلب در شبهکد نادیده گرفته 5ميشود تا ماهیّت 6الگوریتم شفافتر ،مختصرتر بیان شود.
ما با الگوریتم درجي شروع ميکنیم که یک الگوریتم کارا 7برای مرتبسازی تعداد کمي عنصر 8است.
مرتبسازی درجي روشي است که بسیاری از افراد برای مرتبکردن تعدادی کارت در بازی کارت استفاده
ميکنند .اگر به روشي که افراد طي ميکنند ،دقت کنیم آنها کارتها را روی میز پخش ميکنند و سپس
دست چپ خود را که در ابتدا خالي 9است بهعنوان محلي برای مرتبسازی در نظر ميگیرند سپس در هر بار
یک کارت از روی میز برداشته و در محل صحیح 10خود در دست چپشان درج ميکنند .هر بار که یک
کارت برداشته ميشود برای یافتن محل صحیح آن از چپ به راست کارتهای موجود در دست چپ با کارت
فعلي مقایسه ميشود تا به محلي برسیم که کارت موردنظر بزرگتر از آن جایگاه و کوچکتر از جایگاه بعدی
آن است.
شکل ( 2-1الگوریتم مرتبسازی درجي شبیه به مرتبکردن کارتها در بازی کارت یا پاسور است)
1 Software-Engineering
2 منظور از انتزاع ،موهومي و مفهومي بودن یک موضوع است (خیلي قابل لمس نیست) Data Abstraction:
3 Modularity
4Error Handing
نادیده گرفتن 5 Ignored
6 Essence
7 Efficient
8 Element
9 Empty
1 Correct Position 0
16
ما شبهکد را در غالب یک رویه(1یا تابع) به نام Insertion-Sortارائه ميکنیم که بهعنوان پارامتر 2ورودی
یک آرایه به شکل ]𝑛 𝐴 [1. .دریافت ميکند که شامل توالي به طول nاز اعدادی است که قرار است مرتب
شوند .در کد ما طول آرایهی Aبه شکل A.Lengthنمایش داده شده است .این الگوریتم اعداد ورودی را
درجا 3مرتب ميکند؛ یعني همان آرایهی Aرا بدون نیاز به آرایهی دیگری آنقدر جابهجا ميکند تا مرتب
شوند .شکل زیر مثالي از مرتبسازی درجي است و روالي را که طي ميشود ،نشان ميدهد.
1 Procedure
2 Parameter
3 In place
17
جدول تغییرات متغیرها
A J i Key
}{5,2,4,6,1,3 1 0 2
}{5,5,4,6,1,3 -1
}{2,5,4,6,1,3 2 1 4
}{2,5,5,6,1,3 0
}{2,4,5,6,1,3 3 2 6
4 1
}{2,4,5,6,6,3 3
}{2,4,5,5,6,3 1
}{2,4,4,5,6,3 0
}{2,2,4,5,6,3 -1
}{1,2,4,5,6,3 5 3
}{1,2,4,5,6,6 4
}{1,2,4,5,5,6 3
}{1,2,4,4,5,6 2
}{1,2,3,4,5,6 1
0
توضیحات مربوط به الگوریتم باال:
اندیس jکارت فعلي که قرار است در جای خود در دست چپ درج شود ،مشخص ميکند.
در هر دور از حلقه 𝐴[1. . 𝑗 − 1] ،forبخشي از آرایه است که تا االن مرتب شده است و بقیه آرایه در
]𝑛 𝐴[𝑗 + 1. .قرار دارد.
حلقهی whileبرای شیفت دادن عناصر به یک خانه بعد از خود استفاده ميشود تا خانهی مربوط به عنصر
فعلي خالي ميشود.
یادآوری :هر حلقه شامل بخشهای زیر است:
18
-2شرط اجرای حلقه که در اصطالح به آن Maintenanceبه معني حفظ و نگهداری گفته ميشود.
-3عملیات هر گام که در اصطالح به آن Iteration-Expressionگفته ميشود.
-4شرط پایان که در اصطالح به آن Terminationگفته ميشود.
-5بدنهی حلقه که حاوی کدهایي است که در صورت صحّت شرط ،اجرا خواهد شد و در اصطالح به آن
Bodyگفته ميشود.
تمرین: -2-3
-1مانند شکل 2.2مدلي رسم کنید که عملیات الگوریتم مرتبسازی درجي را روی آرایه زیر نشان دهد.
-2تابع insertion-sortرا طوری بنویسید که به جای مرتبسازی صعودی ،مرتبسازی نزولي انجام
دهد.
-3مسأله جستجو1را در نظر بگیرید:
ورودی :توالي از nعدد به شکل )𝑛𝑎 𝐴 = (𝑎1, 𝑎2, … ,و یک مقدار به نام Vکه در حال جستجوی آن
هستیم.
خروجي :اندیس iبهطوریکه ]𝑖[𝐴 = 𝑉 یا مقدار 2NILاگر Vدر آرایه پیدا نشود.
پاسخ:
19
-4فرض کنید دو آرایه باینری به طول nبیت به نام Aو Bداریم .جمع هرکدام از خانههای دو آرایه را
در خانهی متناظر آنها در آرایه Cذخیره کنید و سپس آرایه Cرا چاپ کنید .برای این مسأله یک تابع
تعریف کنید( .راهنما :با توجه به اینکه ممکن است جمع دو عدد یک خانه اضافهتر نیاز داشته باشد،
آرایه Cرا n+1خانهای در نظر بگیرید).
پاسخ:
20
21
تحلیل الگوریتمها: -2-4
منظور از تحلیل1یک الگوریتم پیشبیني2منابع مورد نیاز الگوریتم است .معموالً منابعي مانند حافظه3،پهنای باند
ارتباطي 4،سختافزار کامپیوتر اصلي نگراني 5ما هستند ،امّا اغلباوقات زمان محاسبه 6تنها چیزی است که ما
7
ميخواهیم اندازه بگیریم.
معموالً با تحلیل چند الگوریتم کاندید8برای یک مسأله ميتوانیم کاراترینشان را شناسایي کنیم9.ممکن است
تحلیل به این نتیجه برسد که بیش از یک کاندید قابل اعتماد10است ،امّا اغلب ميتوانیم الگوریتمهای با سطح
پایینتر11را از رده خارج کنیم12.قبل از تحلیل یک الگوریتم باید یک مدل از فناوری پیادهسازی13الگوریتم که
در این کتاب استفاده کردهایم ،ارائه کنیم؛ مدلي که منابع آن فناوری و هزینههای آن را مشخص کند .در این
کتاب ما از یک پردازشگر14و ماشیني با حافظهی دسترسي تصادفي )RAM(15برای مدل کردن محاسبات و
درک الگوریتم ها استفاده خواهیم کرد .در مدل RAMدستورالعملها16یکي پس از دیگری پردازش ميشوند
و هیچ عملیات همزماني17اتفاق نميافتد .مدل RAMشامل دستورالعملهایي است که در کامپیوترهای واقعي
وجود دارند؛ مانند دستورالعملهای محاسباتي(18جمع19،تفریق20،ضرب21،تقسیم22،باقیمانده23،جزءِصحیح24و
1 Analyzing
2 Predicting
3 Memory
4 Communication bandwidth
5 Concern
6 Computational time
7 Measure
8 Candidate
9 Identify
1 Viable 0
1 Inferior Algorithms 1
1 3
Implementation
1 4
One Processor
1 Random Access Machine 5
1 6
Instructions
1 7
Concurrent Operations
1 8
Arithmetic
1 9
Add
2 0
Subtract
2 1
Multiply
2 2
Divide
2 3
Remainder
: Floor24منظور از کف یا جزءصحیح یک عدد اعشاری ،بزرگترین عدد صحیح کوچکتر از آن عدد است؛ بهطورمثال کف عدد 5/7عدد 5ميشود.
22
سقف 1و ،)...دستورالعملهای جابجایي داده( 2خواندن یا بارگذاری 3،ذخیرهسازی 4،کپي )5و دستورالعملهای
کنترلي (دستورالعملهای شرطي 6و انشعاب 7غیر شرطي 8،فراخواني و بازگشت 9تودرتو) .هر یک از این
دستورالعملها مقدار زماني ثابتي10نیاز دارد.
نمونه سؤال امتحان :قطعه کد زیر مربوط به یک الگوریتم مرتبسازی است ،آرایهی { }4،2،1،10،9،7را با
توجه به کد مرتب کنید و در نهایت مشخص کنید قطعه کد مربوط به کدام الگوریتم مرتبسازی است؟ (رسم
جدول تغییرات متغیرها و شکل کلي مرتب شدن آرایه الزامي است).
: Ceiling1منظور از سقف یک عدد اعشاری ،بزرگترین عدد صحیح بعد از آن عدد است؛ بهطور مثال سقف عدد 5/7عدد 6ميشود.
2 Data movement
3 Load
4 Store
5 Copy
6 Conditional
7 Branch
8 Unconditional
9 Call and return
1 Constant amount of time 0
1 Grows 1
1 Traditional 2
1 Running time 3
1 Function of the size of its input
4
1 Size of input 5
1 6
More carefully
1 Number of items the input 7
1 Total number of bits 8
23
در ابتدای تحلیل هر الگوریتم باید منظور از «اندازهی ورودی» بیان شود.
{مطالعه آزاد :الگوریتم ژنتیک چیست؟ مزایا و معایب آن و ربط این الگوریتم را با قانون تکامل داروین بیان
کنید.
منظور از «زمان اجرا»ی یک الگوریتم بهازای یک ورودی خاص تعداد عملیات اصلي 1یا گامهایي 2که در
3
اجرای برنامه طي شده است ،ميباشد .بهتر است زمان اجرا را تعداد گامها در نظر بگیریم تا غیروابسته به ماشین
باشد .هرچند اجرای هر خط از شبکه زمان متفاوتي نیاز دارد ،امّا با زمان اجرای «iمین» خط را C1در نظر
ميگیریم و منظور از Cکلمه Constantبه معني یک زمان ثابت است .ما در الگوریتم مرتبسازی درجي
«هزینه»ی هر دستورالعمل را یک واحد در نظر ميگیریم و بهازای تعداد دفعاتي که آن دستورالعمل اجرا
ميشود ،یک واحد به هزینه اضافه ميکنیم؛ بنابراین داریم:
زمان اجرای الگوریتم برابر است با جمع تعداد دفعات اجرای هر دستورالعمل .توجه کنید که دستورالعملي که
Ciگام برای اجرا طول ميکشد و nبار اجرا ميشود ،کل زمان اجرایش Cinخواهد شد .برای محاسبه )T(n
(یعني کل زمان اجرای الگوریتم) جمعِ ضربِ هزینه در تعداد دفعات اجرا را بدست آورید؛ بنابراین برای
الگوریتم باال داریم:
24
در این الگوریتم بهترین حالت1زماني رخ ميدهد همهی عناصر آرایهی ورودی مرتب باشند .در این حالت با
توجه به اینکه𝑦𝑒𝐾 ≤ ] 𝑖 [ 𝐴 (یعني هر عنصر ،کوچکتر یا مساوی عنصر بعدی خود است) حلقهی while
هرگز اجرا نميشود؛ پس ) T(nدر بهترین حالت بهصورت زیر خواهد بود؛
بنابراین ميتوان زمان اجرا را به شکل 𝑏 𝑎𝑛 +نمایش داد که ثوابت اعداد b , aبه Ciوابسته هستند؛ نتیجه
اینکه ) T(nیک تابع خطي از nاست.
اگر آرایه بهطور برعکس باشد (یعني مرتب نزولي) بدترین حالت رخ ميدهد .در این حالت حلقهی forبهازای
) n ( n+1
= 𝑗 ∑𝑛𝑗=2و بهطور سادهتر ميتوان نوشت: تمام عناصر ورودی یکبار اجرا ميشود؛ یعني − 1
2
𝑛 )n(n−1
∑ =)(𝑗−1
𝑗=2 2
نتیجه اینکه ) T(nدر بدترین حالت برای الگوریتم مرتبسازی درجي عبارتنداز:
1 Best-case
25
ميتوان بدترین حالت را به شکل 𝑐 𝑎𝑛2 + 𝑏𝑛 +نشان داد که b ,aو cثوابتي هستند که وابسته به
هزینههای Ciميباشند؛ بنابراین این زمان اجرا ،توان 2ای از 1 nاست.
مثال T(n) :را برای الگوریتم جستجوی خطي بهازای nورودی در بهترین و بدترین حالت به دست آورید.
پاسخ:
بهترین حالت:
)𝑇(𝑛) = ( 0 ∗ 1 ) + ( 0 ∗ 1 ) + ( 𝑐3 ∗ 1 ) + ( 0 ∗ 1 ) + ( 𝑐5 ∗ 1
)+ ( 𝑐6 ∗ 1 ) + ( 0 ∗ 1 ) + ( 𝑐8 ∗ 0 ) + ( 0 ∗ 1
= 𝑐3 + 𝑐5 + 𝑐6
بدترین حالت:
26
𝑇(𝑛) = ( 0 ∗ 1 ) + ( 0 ∗ 1 ) + ( 𝑐3 ∗ 𝑛 ) + ( 0 ∗ ( 𝑛 − 1 ) ) + ( 𝑐5 ∗ ( 𝑛 − 1 ) ) +
( 𝑐6 ∗ 1 ) + ( 0 ∗ ( 𝑛 − 1 ) ) + ( 𝑐8 ∗ 0 ) + ( 0 ∗ 1) = ( 𝑐3 ∗ 𝑛 ) + ( 𝑐5 ( 𝑛 −
𝑏 1 ) ) + 𝑐6 = 𝑛 𝑐3 + 𝑛 𝑐5 – 𝑐5 + 𝑐6 = 𝑛 ( 𝑐3 + 𝑐5 ) + 𝑐6 – 𝑐5 = 𝑛𝑎 +
تمرین: -2-6
اگر هزینهی اجرای دستورات انتصاب را در آرایه ] 1 ،𝐴 = [ 31, 41, 59, 26, 41, 58در نظر بگیریم و
هزینهی اجرای حلقهها و ifو elseرا 2و دیگر عملیات را هم 1در نظر بگیریم ،حساب کنید بهازای آرایهی
زیر در بهترین و بدترین حالت ،زمان اجرای الگوریتم مرتبسازی درجي چقدر خواهد بود؟
27
تحلیل بهترین و بدترین حالت: -2-7
هرچند در تحلیل الگوریتم مرتبسازی درجي ما بهترین و بدترین حالت را محاسبه کردیم ،امّا ازاینپس فقط
روی به دست آوردن زمان اجرای بدترین حالت1متمرکز ميشویم که عبارت است از «طوالنيترین زمان اجرا
برای هر ورودی به اندازه » n؛ چراکه:
-1زمان اجرای بدترین حالت یک الگوریتم ،باالترین حدِ2زمان اجرا را برای هر ورودی به دست ما ميدهد و
یک ضمانت3برای این است که آن الگوریتم هرگز بیشتر از این زمان طول نخواهد کشید .ما نیاز داریم که
یک برآورد تجربي 4از بدترین زمان اجرا داشته باشیم که امیدوار باشیم که الگوریتم هیچوقت شرایط
بدتری را تجربه نميکند.
5
-2در برخي الگوریتمها ،بدترین حالت خیلي بهندرت رخ ميدهد( .برای مثال در جستجوی یک پایگاه داده
برای یک داده خاص درحاليکه آن داده در Databaseوجود ندارد) ،امّا در برخي کاربردها جستجوها
مکرراً بهدنبال دادهای ميگردند که غایب است.
-3حالت میانگین6نیز اغلب اوقات مانند بدترین حالت است .برای مثال ،فرض کنید ما nعدد تصادفي انتخاب
ميکنیم و الگوریتم مرتبسازی درجي را روی آنها اعمال ميکنیم .چقدر طول خواهد کشید تا در زیر
آرایهی ] 𝐴[1. . 𝑗 − 1عنصر ]𝑗[𝐴 درج شود؟ در حالت میانگین ،نیمي از عناصر این زیر-آرایه کوچکتر
از ]𝑗[𝐴 و نیمي بزرگتر هستند؛ بنابراین ،در حالت میانگین نیمي از عناصر این زیر-آرایه چک ميشود؛
بنابراین tj ،برابر با j/2است .در نتیجه زمان اجرای حالت میانگین نیز تابع درجه دومي7از اندازه ورودی
است؛ دقیقاً مانند زمان اجرای بدترین حالت است.
-4در برخي مسائل ما بهدنبال زمان اجرای حالت میانگین یک الگوریتم هستیم ،امّا همانطورکه در فصلهای
آینده در تکنیک تحلیل احتماالتي 8صحبت خواهیم کرد ،محدوده 9تحلیل حالت میانگین محدود10است
چراکه گاهياوقات مشخص نیست مقدار ورودی میانگین یک مسأله خاص چیست .در اکثر مواقع ما در
نظر ميگیریم که ورودیها تقریباً به یک اندازهی مساوی هستند ،امّا درعمل11این فرضیه 1ممکن است
28
نقض شود 2.در این مواقع از الگوریتمهای تصادفي3استفاده ميکنیم تا انتخابهای تصادفي از کل دادهها با
اندازههای مختلف داشته باشد تا اجازه دهد که با کمک تحلیل احتماالتي زمان اجرای مورد انتظار را
پیشبیني کنیم.
4
نرخ رشد: -2-8
در تحلیل الگوریتم مرتبسازی درجي ما برای اینکه تحلیل الگوریتم سادهتر شود برخي مفاهیم را حذف
کردیم؛ مثالً در ابتدا هزینهی واقعي هر عبارت را نادیده گرفتیم و همه را مقدار ثابت Ciدر نظر گرفتیم.
سپس مشاهده کردیم که در این حالت نیز جزئیات زیادی بهدست ميآید؛ برای مثال زمان اجرای بدترین حالت
بهصورت 𝑐 𝑎𝑛2 + 𝑏𝑛 +به دست آمد که به ثوابت b ,a 5و cوابسته است و آن ثوابت خود به
هزینههای Ciوابسته بودند؛ درنتیجه ثوابت وابسته به Ciرا نیز نادیده گرفتیم.
در ادامه ما یک سادهسازی دیگر انجام ميدهیم که به آن نرخرشد6یا ترتیبرشد7گفته ميشود و عبارتاستاز
اینکه فقط جملهی آغازین8فرمول an29را در نظر ميگیریم .چراکه جمالت بعدی در اندازههای عظیم nناچیز
خواهد بود .همچنین ضریب10ثابت جملهی اول یعني 𝑎. 𝑎𝑛2را نیز بهدلیل تأثیر محاسباتي کمي که دارد
حذف ميکنیم.
در بدترین حالت الگوریتم مرتبسازی درجي با حذف این موارد تنها 𝑛2ميماند که آن را به شکل
𝜃𝑛2
11نشان ميدهیم و ميخوانیم «تِتای اِندو».
از این پس وقتي گفته ميشود یک الگوریتم کاراتر از الگوریتم دیگر است ،به این معني ميباشد که نرخ رشد
زمان اجرای بدترین حالت مربوط به الگوریتم اول کمتر از الگوریتم دوم است .البته دقت کنید که با توجه به
ضرایب ثابت و جمالت دوم به بعد که حذف کردیم ممکن است الگوریتم دوم برای ورودیهای کوچک زمان
: assumption1تفاوت فرضیه و تئوری این است که فرضیه چیزی است که اثبات نشده ولي تئوری چیزی است که روی آن کار و اثبات شده است.
2 نقض شدن Violated
3
Randomized algorithm
4
Order of growth
5Constants
6 Rate of growth
7 Order of growth
8 Leading term
9 Formula
1 Factor 0
1 𝜃 : theta of n-squared 1
29
کمتری نسبت به الگوریتم اول صرف کند اما اگر ورودیها به اندازه کافي بزرگ باشد قطعا الگوریتمي که برای
مثال ) 𝛩(𝑛2است ،سریعتر از الگوریتمي که ) 𝛩(𝑛3است عمل ميکند.
تمرین: -2-9
𝑛3
باشد θرا برای -1اگر زمان اجرای یک الگوریتم در بدترین حالت − 100𝑛2 − 100𝑛 + 3
100
آن نمایش دهید.
پاسخ :طبق مطالب گفته شده در باال ضرایب ثابت و جمالت دوم به بعد را حذف ميکنیم؛ بنابراین
𝜃 = 𝑛3ميباشد.
-2مرتبسازی nعدد که در آرایه Aذخیره شدهاند را به این شکل که ابتدا کوچکترین عدد را یافته و
با ] 𝐴[1جا به جا کنید و سپس دومین عدد کوچک را با ] 𝐴[2جا به جا کنید و این کار را تا عنصر
n-1ام ادامه دهید ،در نظر بگیرید .شبهکد این الگوریتم را بنویسید( .راهنما :این الگوریتم بهنام
«الگوریتم انتخابي» 1شناخته ميشود ).چرا این الگوریتم فقط n-1عنصر را بررسي ميکند و نه همهی n
عنصر را؟ بهترین و بدترین حالت را برای این الگوریتم بهدست آورید.
پاسخ :زیرا با هر بار اجرای حلقه forعدد بزرگتر به سمت خانه nاُم و در نهایت در خانهnاُم قرار ميگیرد .به
همین دلیل در خانه آخر عدد بزرگتر قرار دارد و آن خانه مورد بررسي قرار نميگیرد.
-3جستجوی خطي را در نظر بگیرید .چند عنصر در حالت میانگین باید چِک شود تا عنصر موردنظر پیدا
شود؟ (فرض کنید که عنصر در آرایه موجود است ).در بدترین حالت چطور؟ حالت میانگین و بدترین
حالت را به شکل θنمایش دهید( .منظور از θاین است که ضرایب ثابت و جمالت دوم به بعد را
حذف کنید)
پاسخ :در بهترین حالت یک بار ( ) 𝜃 = 1و در بدترین حالت و در حالت میانگین nبار ( 𝑛 = ) θ
-4چطور ميتوان هر الگوریتمي را طوری تغییر داد که بهترین زمان اجرای خوبي داشته باشیم؟
1
Selection Sort
30
فصل سوم
اگر اندازه ورودی nبه اندازه کافي بزرگ باشد ،زمان اجرای بدترین حالت مرتبسازی ادغامي )𝑛 𝛩(𝑛 lg
است؛ بنابراین ،رقابت را نسبت به الگوریتم مرتبسازی درجي که زمان اجرای بدترین حالت آن ) 𝛩(𝑛2است،
خواهد برد .هرچند گاهي اوقات ميتوان بهطور دقیق3زمان اجرای یک الگوریتم را مشخص کرد؛ (همانطور که
در مورد الگوریتم مرتبسازی درجي در فصل 2این کار را کردیم) اما محاسبه دقیق زمان اجرا آنقدر زحمت
الزم دارد که معموالً ارزشش را ندارد.
اگر اندازهی ورودی خیلي بزرگ باشد ،دیگر ضرایب و جمالت دوم به بعد چندجملهای آنقدر نسبت به
جملهی اول ناچیز خواهد بود که در نظر گرفته نميشود؛ بنابراین در این مواقع ما «کارایي تقریبي» 4الگوریتمها
را مورد مطالعه قرار ميدهیم و معموالً الگوریتمي که کارایي تقریبي آن بهتر باشد ،برای همه نوع ورودیها (به
جز ورودیهای خیلي کوچک )5گزینه مناسبي خواهد بود.
این فصل روشهای استاندارد مختلفي برای سادهسازی تحلیل تقریبي الگوریتمها ارائه ميکند .در ادامه نگاهي به
«نمادهای تقریبي» 6خواهیم داشت.
1
characterization
2
Alternative
- Precision3
4
Asymptotic Efficiency
5
Very Small Inputs
6
Asymptotic Notation
31
نمادهای تقریبی (یا نمادهای همبستگی یا نمادهای مُجانبی): - 3 -2
این نمادها برای توصیف زمان اجرای تقریبي یک الگوریتم که در قالب یک تابع تعریف شده و بر روی اعداد
طبیعي 𝑁 = { 0, 1, 2, … }1عمل ميکند ،استفاده ميشود.
θ(𝑔(𝑛)) = f(𝑛): ∃ 𝑐1 , 𝑐2 , 𝑛0 > 0 ∶ 0 < 𝑐1 𝑔(𝑛) < 𝑓 (𝑛) < 𝑐2 𝑔(𝑛), ∀𝑛 > 𝑛0
این رابطه به این معناست که آهنگ رشد fو gبرای مقادیر بزرگ nیکسان است و هیچیک از این دو تابع از
دیگری جلو نميزند؛ بهطور مثال زمان اجرای مرتبسازی درجي 𝑐 𝑎𝑛2 + 𝑏𝑛 +است بنابراین:
) . 𝑇(𝑛) = 𝜃(𝑛2زیرا ميتوان بهسادگي مقادیر مثبتي برای c1و c2یافت که:
اثبات :باید نشان داد که نميتوان مقادیر مثبتي برای c2 , c1و n0یافت که رابطهی
𝑐1 𝑛3 < 100𝑛2 + 5𝑛 − 4 < 𝑐2 𝑛3برای همه مقادیر n > n0برقرار باشد ،به وضوح بهازای هر
مقدار c1 > 0و برای مقادیر بزرگ nخواهیم داشت.) 𝑐1 𝑛3 ≰ 100𝑛2 + 5𝑛 − 4( :
1
Natural Numbers
32
: O –Notation -3-4
نماد 𝞱 به صورت تقریبي ،یک تابع را از باال به پایین محدود1ميکند .وقتي ما فقط یک «حد باالی تقریبي»
2
داشته باشیم ،از نماد Oاستفاده ميکنیم .برای تابع فرضي ) ،g(nنماد (O(g(n))) Oرا (که به صورت بیگ اُ
جي اِن3یا )) O(g(nتلفظ ميشود) ،به صورت زیر تعریف ميشود:
یعني آهنگ رشد تابع ) g(nبرای مقادیر بزرگ ،nبیشتر یا مساوی آهنگ رشد تابع ) f(nاست ،در این صورت
مي گوییم ) g(nکران باالی مجانبي4برای ) f(nاست؛ بهطور مثال:
1
Bounds
2
Asymptotic Upper bound
3
”“Big-O of g of n
4حد باالی تقریبي
”“Big-Omega of g of n
5
33
تلفظ ميشود .تعریف ریاضیاتي این عالمت به شکل زیر ميباشد که در آن تابع ) g(nکران پایین مجانبي برای
تابع ) f(nاست.
نکته مهم :به زبان ساده ،اگر زمان تقریبي دقیق اجرای یک الگوریتم خواسته شد ،یعني 𝞱 و اگر حداکثر زمان
تقریبي خواسته شد ،یعني Oو اگر حداقل زمان تقریبي خواسته شد ،یعني .Ω
34
تمرین: -3-7
-1فرض کنید ( f(nو ) g(nتوابع غیرمنفي تقریبي باشند ،با استفاده از تعریف نماد 𝞱 ثابت کنید:
))Max (f(n), g(n)) = 𝞱(f(n) + g(n
-2ثابت کنید برای هر مقدار ثابت aو bبرای هر مقدار داریم:
)(n + a)b = 𝞱 (nb
-3ثابت کنید که این جمله غلط است« :زمان اجرای الگوریتم Aحداقل ) O(n2است».
-4آیا عبارات زیر درست است؟
الف2n+1 = O(2n) :
ب22n = O(2n) :
1
:o –Notation -3-8
همانطورکه گفته شد نماد ) 2O (Big oممکن است چندان به تابع اصلي نزدیک نباشد؛ برای مثال
) 2n2 = O(n2به تابع اصلي نزدیک است امّا ) n2 ،2n = O(n2به 2nچندان نزدیک نیست .برای نمایش
حد باالیي که به تابع موردنظر نچسبیده است ،از نماد ) o (Little oاستفاده ميکنیم و آن را به صورت زیر
تعریف ميکنیم:
برای مثال oکوچک 2nبرابر است با ) 2n = o(n2که اینطور مي خوانیم ،2n :اُردِرِ n2است.
:ω –Notation
3
-3-9
ɷکوچک نسبت به Ωبزرگ همان نسبت oکوچک به Oبزرگ است؛ یعني نماد ɷکوچک حد پاییني را
𝑛2
برابر است با n؛ مشخص ميکند که به تابع مدنظر نچسبیده است؛ برای مثال اُمگای مربوط به
2
1
اُ کوچک
2
اُ بزرگ
3
اُمگای کوچک
35
𝑛0 > 0 𝑠𝑢𝑐ℎ 𝑡ℎ𝑎𝑡 0 ≤ 𝑐𝑔(𝑛) < 𝑓(𝑛) 𝑓𝑜𝑟 𝑎𝑙𝑙 𝑛 ≥ 𝑛0 }.
مثال :اگر g(n) = 2n2 + n + 10داشته باشیم ،نماد θو Ωو ( Oطبق شکل ترتیب رشد الگوریتم) به
صورت زیر است:
1
یکنواختی: -3-11
تابع ) f(nرا دارای «افزایش یکنواخت» 2ميدانیم اگر nو mی داشته باشیم که:
)𝑛(𝑓 ≤ )𝑚(𝑓 و 𝑛 ≤ 𝑚
تابع ) f(nرا دارای «کاهش یکنواخت» 3ميدانیم اگر nو mی داشته باشیم که:
)𝑛(𝑓 ≥ )𝑚(𝑓 و 𝑛 ≤ 𝑚
تابع ) f(nرا «به شدت افزایشي» 1ميدانیم ،اگر nو mبه صورت )𝑛(𝑓 < )𝑚(𝑓 و باشد 𝑛 < 𝑚.
1
Monotonicity
2
Monotonically Increasing
3
Monotonically Decreasing
36
تابع ) f(nرا «به شدت کاهشي» 2مي دانیم ،اگر nو mبه صورت )𝑛(𝑓 > )𝑚(𝑓 و باشد 𝑛 < 𝑚.
برای مثال شکل زیر تابع افزایشي است ،ولي به شدت افزایشي نیست چراکه ميتوان mو nی پیدا کرد
که )𝑛(𝑓 = )𝑚(𝑓 ولي 𝑛 < 𝑚.
1
Strictly Increasing
2
Strictly Decreasing
37
1
باقیمانده: -3-12
𝑎
برای هر عدد صحیح aو هر عدد صحیح مثبت nمُد یا باقیمانده تقسیم aبر nبه صورت زیر نمایش
𝑛
2
داده ميشود:
𝑎
⌊ 𝑛 𝑎 𝑚𝑜𝑑 𝑛 = 𝑎 − ⌋
𝑛
یعني aمنهای nدر کفِ aبر ( nمنظور از «کف» ،حذف بخش اعشاری یک عدد است)
مثال:
10
⌊ 10 mod 3 = 10 − 3 ⌋ = 10 − 9 = 1
3
تمرین -3-13
-1نشان دهید اگر ) f(nو ) g(nتوبع افزایشي باشند ،توابع )𝑛( f(𝑛) + gو )) f(g(nنیز افزایشي
است و اگر ) f(nو ) g(nعالوهبر افزایشي بودن منفي نباشند ) f(nدر ) g(nیعني )𝑛(f(𝑛). g
افزایشي است.
1
Modular Arithmetic
⌈⌉ :عالمت سقف و ⌋⌊ :عالمت کف ميباشند. 2
38
فصل چهارم
الگوریتمهای بازگشتی
1
الگوریتم بازگشتی: -4-1
اگر یک الگوریتم در حین اجرا ،خودش2را فراخواني3کند به این الگوریتم ،الگوریتم بازگشتي گفته ميشود.
الگوریتمهای بازگشتي از پرکاربردترین و گاهي پرهزینهترین الگوریتمها در پیادهسازی راه حل مسائل هستند.
1
Recursive Algorithm
2
Itself
3
Call
39
1
اعداد فیبوناچی: -4-4
این اعداد به صورت زیر تعریف ميشوند:
𝑓0 = 0
𝑓1 = 1
𝑓𝑖 = 𝑓𝑖+1 + 𝑓𝑖−2 𝑓𝑜𝑟 𝑖 ≥ 2
بنابراین توالي زیر تولید خواهد شد:
… 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,
به دست آوردن جمله nام از دنباله فیبوناچي یک مسأله بازگشتي مشهور است.
به طور مثال شکل محاسبه جمله هفتم این توالي یعني عدد ،8به صورت زیر است:
1
Fibonacci Numbers
40
این مسأله به سه روش قابل حل است:
-1به صورت تکراری (بدون استفاده از الگوریتم بازگشتي):
41
-2به صورت بازگشتي:
-3با استفاده از برنامهنویسي پویا :این روش در فصلهای آینده توضیح داده خواهد شد.
1
مطالعه آزاد :نسبت طالیی: -4-5
φهستند که دو ریشهی معادلهی 𝑥 2 = 𝑥 2 + 1
اعداد فیبوناچي مربوط به نسبت طالیي φو مزدوج آن ̂
ميباشند.
نسبت طالیي یا عدد φدر ریاضیات و هنر هنگامي رخ ميدهد که« :نسبت بخش بزرگتر به بخش کوچکتر
برابر با نسبت کل به بخش بزرگتر» باشد.
تعریف دیگر آن از این قرار است که« :عددی مثبت است که اگر به آن یک واحد اضافه کنیم به مربع آن
خواهیم رسید».
تعریف هندسي آن نیز چنین است« :طول مستطیلي به مساحت واحد که عرض آن یک واحد کمتر از طولش
باشد» و آن را به شکل زیر نمایش ميدهیم:
𝑏𝑎+ 𝑎
= 𝜑 =
𝑎 𝑏
که aهمان طول و bهمان عرض مستطیل است و در نهایت φرا برابر عدد زیر در نظر ميگیریم:
φ ≃ 1/6180339887
روانشناسان بر این باورند که زیباترین مستطیل به دید انسان مستطیلي است که نسبت طول به عرض آن برابر عدد
طالیي باشد .دلیل این امر آن است که این نسبت در شبکیهی چشم انسان رعایت شده و هر مستطیلي که این
نسبت را دارا باشد به چشم انسان زیبا ميآید.
1
Golden Ratio
42
فصل پنجم
3
روش تقسیم و غلبه: -5-2
بسیاری از الگوریتمهای مفید در ساختار خود از حالت بازگشتي استفاده ميکنند؛ یعني برای حل یک مسألهی
فرضي ،آن ساختار دائماً خودش را فراخواني ميکند تا به حد کافي مسأله کوچک شده و قابل حل شود .این
فراخواني ممکن است یک یا چندینبار اتفاق بیفتد .این نوع الگوریتمها نوعاً از روشي استفاده ميکنند که به
تقسیم و غلبه مشهور است؛ یعني مسأله را به چندین زیرمسأله ميشکند4که آن زیرمسأله شبیه مسألهی اصلي5در
اندازهی کوچکتری است ،سپس زیرمسأله را حل ميکند و پاسخ زیرمسألهها را با هم ترکیب ميکند تا به حل
مسألهی اصلي بینجامد.
1 Incremental
2 Approach
3
Divide-and-conquer
4 Break
5 Original problem
6 Paradigm
7 Divide
43
.3مرحله ترکیب2:پاسخ زیرمسأله با هم ترکیب ميشود تا مسألهی اصلي حل شود.
مثال :الگوریتم مرتبسازی ادغامي از روش تقسیم و غلبه استفاده ميکند؛ یعني داریم:
𝑛
.4مرحله تقسیم :توالي nعنصر را به دو زیر توالي3با عنصر تقسیم ميکند.
2
.5مرحله غلبه :دو زیر توالي را با استفاده از مرتبسازی ادغامي مرتب ميکند.
.6مرحله ترکیب :دو زیر توالي مرتب شده را با هم ادغام ميکند تا پاسخ مرتب شدهی نهایي را تولید کند.
عملیات تقسیم آنقدر ادامه پیدا ميکند تا تعداد عناصری که باید مرتب شوند 1باشد و البتّه طبیعتاً یک عنصر
نیازی به مرتبسازی ندارد؛ بنابراین اصل مرتبسازی زماني اتفاق ميافتد که دو عنصر با هم در مرحله بعد
ترکیب ميشوند .مرتبسازی ادغامي را با تابع )𝑟 𝑀𝐸𝑅𝐺𝐸 (𝐴, 𝑝, 𝑞,انجام ميدهیم که در آن A ،آرایهای
است که باید مرتب شود و p,q,rاندیسهای آرایه هستند بهطوریکه 𝑟 < 𝑞 ≤ 𝑝 .
تابع فرض ميکند زیر آرایه ] 𝑞 … 𝑝 [ 𝐴 و ] 𝑟 … 𝐴 [ 𝑞 + 1مرتب شده هستند .تابع آنها را ادغام ميکند
تا زیرآرایهی ] 𝑟 … 𝑝 [ 𝐴 به دست آید.
1 Conquer
2 Combine
3
Subsequence
44
و کد C++این تابع به صورت زیر است:
45
مرجع کدها :سایت http://www.geeksforgeeks.org/merge-sort/
مثال :آرایهی Aبا عناصر 10 .82 .9 .3 .43 .27 .38را در نظر بگیرید .با الگوریتم مرتبسازی ادغامي آن را
مرتب کنید.
)(𝑛−1
𝑡𝑛𝑖 = 𝑚 به دست آورید. راهنمایی m :را از طریق فرمول
2
مثال :آرایهی Aبا عناصر 5,2,4,7,1,3,2,6را در نظر بگیرید .شکل کلي مرتبسازی آرایه Aرا با کمک
الگوریتم مرتبسازی ادغامي رسم کنید.
مثال :2آرایهی Aبا عناصر 38, 27, 43, 3, 9, 82, 10را در نظر بگیرید .با الگوریتم مرتبسازی ادغامي
آن را مرتب کنید.
46
آرایهی Aبا عناصر} {0, 10, 38, 7, 43, 8, 9, 1, 2, 10را در نظر بگیرید .شکل کلی مرتبسازی آرایه Aرا با
کمک الگوریتم مرتبسازی ادغامی رسم کنید.
47
جستجوی دودویی: -5-3
در این جستجو یک آرایه مرتب داریم که در آن به دنبال یک عنصر ميگردیم ،برای یافتن آن ابتدا آرایه را به
دو قسمت تقسیم ميکنیم و عنصر مورد جستجو را با عنصر وسط آرایه مقایسه ميکنیم ،اگر عنصر مورد جستجو
بزرگتر از عنصر وسط آرایه بود ،تِکهی دوم آرایه را به همین روش تا یافتن عنصر موردنظر به دو قسمت تقسیم
و مقایسه ميکنیم.
مثال :با توجه به قطعه کد زیر که تابع جستجوی دودویي است ،در آرایه زیر به دنبال عدد 30بگردید .جدول
تغییرات متغیرها را رسم کنید.
48
فصل ششم
مقدمه -6-1
اگر به حل مسأله فیبوناچي به روش بازگشتي دقت کنیم ،خواهید دید که اکثر جمالت (مانند ) ) Fib(3چندین
بار محاسبه ميشوند ،برای جلوگیری از این پردازشهای تکراری ميتوان هر جملهای که به دست آمد را در
بخشي از حافظه ذخیره کرد و به محض نیاز به آن به جای محاسبه مجدد ،از حافظه پاسخ را خواند .به این روش
در اصطالح حافظه پویا گفته ميشود.
1
الگوریتم مرتبسازی سریع: -6-2
مثال :اعداد زیر را با Quick Sortمرتب کنید:
روش حل:
این الگوریتم را با دو تابع Quick Sortو Partitionبه شکل زیر ميتوان پیادهسازی کرد:
1
Quick Sort
49
تابع : Partition
مثال :اگر arr1و arr2به صورت زیر داده شود ،عناصر arr3که ضرب دو ماتریس است ،به صورت
10 5 3
]𝑎𝑟𝑟1 = [ 7 8 9
1 2 3
5 1
𝑎𝑟𝑟2 = [1 ]2
0 3
10 5 3 5 1 55 29
[7 8 ]9] [1 2] = [43 50
1 2 3 0 3 7 14
55 29
]𝑎𝑟𝑟3 = [43 50
7 14
50
ضرب دو ماتریس با استفاده از سه حلقه تودرتو قابل محاسبه است که در کد زیر در خط 46تا 56مشخص شده
است:
51
الگوریتم ضرب : Strasson -6-4
همانطور که ميدانیم برای کامپیوتر محاسبه ضرب سختتر از محاسبه جمع است؛ بنابراین در حل یک مسأله
اگر بتوان از تعداد ضربها کاست ،آن الگوریتم بهینهتر خواهد بود.
الگوریتم Strassonماتریسها را به روشي ضرب ميکند که تعداد ضربها به ویژه در ابعاد باال بسیار کاهش
پیدا ميکند.
مثال:
52
𝑚6 = ( 3 − 1 ) ∗ ( 1 + 2 ) = 2 ∗ 3 = 6
در نتیجه ماتریس cخواهد بود:
نمونه سؤال :الگوریتم Strassonچیست و چگونه مسأله را حل ميکند؟ از چه الگوریتمي برای حل
مسألهاش استفاده کرده است؟ چه مزایایي نسبت به حالت عادی حل مسأله دارد؟
پاسخ :این لگوریتم روش جدیدی برای حل مسأله ضرب دو ماتریس n*nمربع است که با کاهش تعداد
ضربها باعث ميشود ،پردازشها کاهش یافته و سریعتر نتایج به دست آید .کاربرد عملي این الگوریتم در
ضرب ماتریسهای بزرگ است ،هرچند که نسبت به الگوریتمهای جدیدتر کمي کندتر است.
𝑛
=𝑚
2
𝑦 𝑢 = 𝑥 ∗ 10𝑚 +
53
𝑧 𝑣 = 𝑤 ∗ 10𝑚 +
𝑛 6
=𝑚 = =3
2 2
𝑢 = 102436 = 102 ∗ 103 + 436 , 𝑣 = 724300 = 724 ∗ 103 + 300
)𝑢𝑣 = ( 102 ∗ 724 ) ∗ 106 + ( 102 ∗ 300 + 436 ∗ 724 ) ∗ 103 + ( 300 ∗ 436
1
برنامهنویسی با حافظه پویا: -6-6
برنامهنویسي پویا یک روش نوشتن الگوریتمهاست که در آن مسأله اصلي را به استفاده از یک فرمول بازگشتي
حل ميکنیم؛ یعني در ابتدا برای مسأله ،یک ضابطه بازگشتي ميیابیم .سپس با استفاده از یک حافظه سعي بر آن
داریم .که در ابتدا مسأله را برای مقادیر اولیه حل کنیم سپس با ترکیب حلهای مقدماتيتر حل مسأله را در
حالت باالتر دنبال مينماییم .این روند را تا آنجا ادامه ميدهیم که به پاسخي برای مسأله اصلي دست یابیم.
روش DPاز آنجا ابداع گردید که بتواند راهحلهای تکراری را که ممکن است در روش ( D&Cتقسیم و
غلبه) به وجود آید را حذف نماید.
1
Dynamic Programming
54
فرمول محاسبه :s
𝑧 )𝑥 ∑𝑛 (𝑥𝑖 −
𝑠 = √ 𝑖=0
𝑁
Nتعداد کل شرکتکنندگان است.
مثال :فرض کنید سه نفر در یک درس فرضي ،نمرههای 100و 200و 300را گرفتهاند .تراز هر کدام از این سه
نفر را حساب کنید.
∑31( 𝑥𝑖 − 𝑥 )2
√=𝑠 = √3333.33 + 3333.33 = 81.65
3
55
اگر به محاسبات باال دقت کنید؛ برای هر نفر به صورت تکراری ̅ xو sمجددا محاسبه شده است .این درحالی
است که محاسبهی هر یک از اینها در آمار باال پردازش باالیی نیاز دارد .برای رفع این مشکل میتوان از
برنامه نویسی پویا استفاده کنیم؛ به این صورت که وقتی برای نفر اول ̅ xو sمحاسبه شد ،در بخشی از حافظه
نگه داشته شود و برای نفرات بعد از همان دادهها استفاده شود.
!𝑛
= )(nk !𝑘!)𝑘(𝑛−
فرمول :
1 𝑛 = 𝑘 𝑟𝑜 𝑘 = 0
)(nk) = {(𝑛−1) + (𝑛−1 𝑒𝑠𝑙𝑒 برای نوشتن برنامه مسأله ثابت ميکنیم که:
𝑘 𝑘−1
با مثال زیر ثابت ميشود که این رابطه صحیح است ،در نتیجه با یک تابع بازگشتي ميتوان مسأله را پیادهسازی
کرد.
56
اما بدون استفاده از برنامهنویسي پویا ،مسأله ،بهینه نخواهد بود ،چرا که برخي محاسبات چندین بار انجام شده
است .برای بهینه کردن این مسأله ،برنامهنویسي پویا را به شکل زیر پیادهسازی ميکنیم:
آرایهای به شکل زیر ایجاد ميکنیم که مقادیر به دست آمده از پردازشهای تکراری در آن ذخیره ميشود و
هرگاه به پاسخ آن پردازش نیاز بود ،از آرایه خوانده و استفاده ميکنیم.
𝑛
) (
𝑘 0 1 2 3 4 5 6
0 1
57
حل مسأله فیبوناچی با استفاده از برنامهنویسی پویا: -6-9
برای حل این مسأله یک آرایه به تعداد جمله خواسته شده ( )nتعریف ميکنیم و یک بار برای همیشه جمع هر
دو خانه را در خانه بعد از آن ميریزیم (یا جمع هر دو خانه را در خانه قبل آنها ميریزیم) ،با اینکار آرایهای به
شکل زیر خواهیم داشت:
… 0 1 1 2 3 5 8 13 21 33
که بهراحتي خانه nاُم آرایه که برابر با پاسخ مسأله هست بدون نیاز به محاسبهِ تکراریِ جملههایِ قبل از آن به
دست ميآید.
58
تمرین :برنامهی فیبوناچي را با استفاده از بازگشتي و برنامهنویسي پویا نوشته و از لحاظ زمان اجرا با هم مقایسه
کنید.
پاسخ :بازگشتي :با توجه به اینکه عملیات اصلي در تابع بازگشتي جمع ) fib(n – 1) + fib(n - 2و بهازای
T(n - 1) + T(n - 2) + O(1) ،nبار اجرا ميشود؛ بنابراین این روش ) O(2nاست.
در روش دوم :با توجه به اینکه عملیات اصلي] f [i] = f [i - 1] + f [i - 2است و این حلقه n*cبار تکرار
ميشود .این روش نیز ) O(nاست.
الگوریتمهای بسیار زیادی برای یافتن کوتاهترین مسیر ارائه شده است که هر کدام از آنها مزایا و معایبي دارد؛
برای مثال یکي پیادهسازی آسان ولي ) T(nباالیي دارد و برعکس.
کاربرد فلوید در نرمافزارهایي مانند گوگل مپ و نرمافزارهای مشابه برای یافتن کوتاهترین مسیر بین دو شهر
است.
یکی از الگوریتمها فِلوید-وارشال است .با یک مثال روش کار آن را توضیح میدهیم.
گام :۱ماتریس مجاورت ( )mرا برای همهی گرهها بهدست آورید( .ماتریس مجاورت ،ماتریسی است که نشان
می دهد از هر گره به گره دیگر یک مسیر مستقیم وجود دارد یا خیر؟ اگر وجود داشت ،وزن یال نوشته
59
میشود و اگر وجود نداشت عالمت ∞ و طبیعتا از هر گره به همان گره ،وزن یال برابر با صفر خواهد بود).
D0را برابر mبگیرید.
گام D1 :2را طوری بسازید که مشخصکننده مینیمم مسیرهایي باشد که فقط از v1ميگذرد و یا مسیر مستقیم
هستند.
گام D2 :3را طوری بسازید که شامل کوتاهترین مسیرهایي باشد که از v1یا v2عبور ميکنند و یا مستقیم
هستند.
گام D3 :4را طوری بسازید که شامل کوتاهترین مسیرهایي باشد که از v1یا v2یا v3ميگذرد و یا مستقیم
است.
60
گام D4 :5را طوری بسازید که شامل کوتاهترین مسیرهایي باشد که از v1یا v2یا v3یا v4عبور کند و یا
مستقیم باشد.
گام :6ماتریس Pرا در حین ساختن ماتریسهای Dبه صورت زیر پر کنید( .همینطور که از D1به Dkپیش
ميروید) ،وقتي کوتاهترین مسیر به دست آمد ،رأس جدیدی که باعث به وجود آمدن مسیر کوتاهتر شده را در
Pیادداشت کنید .اگر از یک رأس به رأس دیگر مسیر مستقیم وجود داشت و این مسیر کوتاهترین مسیر بود در
،Pصفر قراردهید.
گام آخر :برای به دست آوردن کوتاهترین مسیر بین دو رأس به ماتریس Pنگاه کنید .اگر بین آن دو رأس نام
یک رأس دیگر نوشته شده ،مسأله را برای یافتن کوتاهترین مسیر بین آن رأس و ردس مبدأ تبدیل کنید و آنقدر
این کار را تکرار کنید تا نهایتاً به صفر برسید و صفر به معني این است که بین رأس یک مانده به آخر و رأس
آخر مسیر مستقیمي وجود دارد که کوتاهترین مسیر است.
یعني مسأله از یافتن v1به v4به یافتن کوتاهترین مسیر از v2به v4تبدیل شد .مجدداً طبق ماتریس Pخانهی
مربوط به v2به v4صفر است؛ یعني از v2به v4مسیر مستقیمي وجود دارد که کوتاهترین مسیر است ،پس در
نهایت کوتاهترین مسیر بین v1و v4مسیر زیر خواهد بود:
61
الگوریتم فلوید با سه حلقهی تو در تو به شکل زیر قابل پیادهسازی است:
62
فصل هفتم
1
تکنیکهای طراحی الگوریتم ( :)3روشهای حریصانه
دستهای از مسائل وجود دارد که برای حل آنها در طول اجرای برنامه باید همیشه کوچکترین یا بزرگترین
مقدار از یک مجموعه مقدار انتخاب شود .این مسائل با استفاده از الگوریتمهای حریصانه حل ميشود.
برای حل این مسأله ابتدا سکهها را از بزرگ به کوچک مرتب ميکنیم و سپس بهطور حریصانه ابتدا بزرگترین
سکه را انتخاب ميکنیم و باقیمانده سکههای انتخاب شده تا مبلغ موردنظر را به دست آورده و مالک انتخاب
سکههای بعدی قرار ميدهیم؛ بنابراین مراحل به شکل زیر خواهد بود:
Greedy Algorithms
1
63
نکته مهم :راهحل حریصانه همیشه بهترین پاسخ را به دست نميآورد ،چرا که بزرگترین مشکل این روش
بهینهگی محلی1است .بهینهگي محلي یعني ممکن است یک پاسخ در مقطعي از زمان درست به نظر برسد امّا
اگر بازهی زماني افزایش پیدا کند ،آن پاسخ نسبت به کل ،پاسخ صحیحي نیست .به شکل زیر دقت کنید:
فرض کنید که قرار است برنامهای بنویسید که بلندترین قله را در میان یکسری عدد پیدا کند ،اگر شما برنامه را
طوری نوشته باشید که به محض رسیدن به نقطهای که ] 𝑛𝑢𝑚𝑠 [𝑖] < 𝑛𝑢𝑚𝑠 [𝑖 − 1است ،آن را قله
اعالم کند ،با توجه به شکل خواهید دید که در نقطهی Aبرنامه متوقف خواهد شد ،در حاليکه نقطهی Bنیز
این ویژگي را دارد و از نقطهی Aبلندتر است.
مثال :2با استفاده از سکههای زیر 16تومان پول خرد به دست آورید ،با همان شرط که حداقل سکهها به دست آید.
راهحل :اگر با همان الگوریتم قبل مسأله را حل کنیم ،خواهیم دید که پاسخ به صورت زیر خواهد بود:
در این حالت ميبینیم که پاسخ 12 ،1 ،1 ،1 ،1بهعنوان پاسخ نهایي انتخاب ميشود ،در حالي که پاسخ بهینهتر
10 ،5 ،1است.
1
Local Optima
64
1
مسأله کد هافمن: -7-2
الگوریتم هافمن برای فشردهسازی دادهها استفاده ميشود.
𝑎𝑑𝑒𝑑𝑑𝑐𝑐𝑏𝑏𝑎𝑎𝑑𝑐𝑏𝑎𝑎𝑏𝑎
𝑎: 6 𝑏: 4 𝑐: 3 𝑑: 4 𝑒: 1
(فرکانس 2،تعداد تکرار هر چیز معموالً در واحد زمان است و نام فارسي آن بسامد ميباشد).
گام :2از سمت چپ دو کاراکتری را که کمترین تکرار را دارند انتخاب کنید و جمع آنها را به دست آورید.
( d:4و b:4انتخاب شدهاند و جمع آنها یعني 8در باالی آنها نوشته شده است)
گام :3مجدداً از سمت چپ دو کاراکتر دیگر را که کمترین تکرار را دارند ،انتخاب و جمع آنها را به دست
آورید .فقط توجه کنید که دایرهی مربوط به جمعهای قبلي نیز بهعنوان یک کاراکتر قابل انتخاب خواهند بود.
گام :4این کار را تکرار کنید تا کاراکتری برای جمع باقي نماند.
گام :5با توجه به گامهای باال درخت هافمن به شکل زیر از پایین به باال ساخته خواهد شد .از ریشه شروع کنید
و به یال سمت چپ ،صفر و به یال سمت راست ،یک نسبت دهید.
1
Hafman
2
Frequency: Cycles Per Time Unit
65
گام آخر :کد هافمنِ هر کاراکتر ،رشتهای از صفر و یکها از ریشه به سمت آن کاراکتر خواهد بود.
با توجه به توضیحات داده شده به جای ذخیره کردن یا ارسال کاراکتر aکه 8بیت اشغال خواهد کرد ،کد
هافمن آن یعني 00را ذخیره یا ارسال ميکنیم که مشخص است که حداقل 6بیت بهازای هر aفشردهسازی
داریم .در بقیه حروف نیز به همین صورت.
نکته :باید یک فضا هم برای ذخیره کردن کد هر حرف در نظر بگیریم که در مقصد بفهمیم که برای مثال
منظور از 00کاراکتر aبوده است.
66
1
مسأله درخت پوشای کمینه: -7-3
درخت پوشای کمینه با درخت فراگیر مینیمم در گرافهای ارزشدار (وزندار) ساخته ميشود.
فرض کنید گراف ،یک گراف همبند باشد (یعني بین هر دو رأس متمایز آن ،یک مسیر وجود داشته باشد)
منظور از یک درخت پوشا از این گراف ،درختي است که شامل همه رئوس این گراف باشد ولي فقط بعضي از
یالهای آن را در برگیرد.
منظور از درخت پوشای مینیمم (برای گراف همبند وزندار) درختي است که بین درختهای پوشای آن
گراف ،مجموع وزن یالهای آن ،کمترین مقدار ممکن باشد.
مثال :گراف همبند زیر را در نظر بگیرید .گراف ( MSTدرخت پوشای کمینه) آن را به دست آورید.
راهحل :برای حل مسأله از v1شروع ميکنیم و بهطور حریصانه یالي که کمترین وزن را دارد و به یکي از
رأسهای پیمایششده متصل است ،به عنوان ادامه مسیر انتخاب ميکنیم .فقط باید توجه کرد که مسیر الزم
نیست حتماً به صورت حلقه و بههم پیوسته باشد.
1
Minimum Spanning Tree
67
1-
2- 4-
3-
5-
با استفاده از تابع Primبه صورت زیر ميتوان این الگوریتم را پیادهسازی کرد:
68
تمرین :در گراف همبند زیر درخت MSTرا به دست آورید.
1
مسأله فروشنده دورهگرد: -7-1
صورت این مسأله به این شکل است :اگر یک فروشنده دورهگرد از نقطه Aشروع کند و فواصل بین نقاط
مشخص باشد ،کوتاهترین مسیر که از تمام نقاط یکبار بازدید کند و به Aبازگردد ،کدام است؟
در مسأله فروشنده دورهگرد باید از رأس v1به رأسهای دیگر مسیر بههم پیوستهای را پیدا کنید که ضمن گذر
از همه رئوس به رأس v1برگردد .ضمناً این مسیر کمینه نیز باشد و خیلي مهم است که گراف جهتدار باشد.
پاسخ:
1
Travelling Salesman Problem
69
الگوریتم کراسکال: -7-2
این الگوریتم نیز برای به دست آوردن درخت پوشای کمینه استفاده ميشود ،با این تفاوت که مراحل آن با کمي
تفاوت به شکل زیر است:
)( 𝑣1 , 𝑣2 ∶ 1
)( 𝑣3 , 𝑣5 ∶ 2
)( 𝑣1 , 𝑣3 ∶ 3
)( 𝑣2 , 𝑣3 ∶ 3
)( 𝑣3 , 𝑣4 ∶ 4
)( 𝑣4 , 𝑣5 ∶ 5
)( 𝑣2 , 𝑣4 ∶ 6
70
مرحله :2هر یالي که ایجاد دور نکرد ،انتخاب کنید.
توضیح:
از رأس v1شروع کنید و پس از آن رأسي را انتخاب کنید که مجموع یالهای رسیده تا آن رأس ،کمینه شود.
71
مثال :درخت پوشای کمینه را با استفاده از الگوریتم دکسترا به دست آورید.
تمرین :با استفاده از الگوریتم دکسترا کوتاهترین مسیر بین v1و v5را در گراف زیر به دست آورید.
72
فصل هشتم
1
تکنیکهای طراحی الگوریتم ( :)4الگوریتمهای عقبگرد
بازگشت به عقب یا عقبگرد ،تکنیکي در برنامهنویسي است که در آن برای حل یک مسأله ،از یک گراف
جهتدار (درخت جهتدار) استفاده ميشود .در این مسائل ابتدا یک فضای حالت برای مسائل در نظر گرفته
ميشود و آن فضای حالت به صورت گرافي که ،هر رأس آن یک حالت و هر یال آن یک انتخاب از آن حالت
به حالت بعد است ،نمایش داده ميشود .مهمترین مسأله در مسائل عقبگرد ،تشخیص بنبست در یک شاخه و
هرس کردن2آن شاخه است.
مسائلي وجود دارند که نه با تقسیم و غلبه و نه با برنامهنویسي پویا حل نميشوند .الگوریتم حریصانه نیز در این
مسائل به جواب بهینه منتهي نميشود .تنها راهِ یافتنِ راهحلِ بهینه ،تولید کردن تمام راهحلها و آزمایش
آنهاست ،که روشهای عقبگرد به این صورت عمل ميکند .در راهبرد عقبگرد سعي ميکنیم بنبستها را
شناسایي کنیم و از دنبال کردن مسیرهای تکراری جلوگیری کنیم .بهطور خالصه راهبرد عقبگرد عبارت است از
انتخاب دنبالهای از اشیا از یک مجموعه توأم با برآورده کردن یک شرط یا محدودیت.
Back Tracking
1
2
Pruning
73
راهحل:
74
.7به دو صورت ميتوان یک درخت را پیمایش کرد:
جستجوی ساده:
یعني همه گرهها را تک به تک بررسي کنیم و ببینیم که پاسخ صحیح هست یا خیر ،که در این حالت
پردازش بسیاری الزم دارد.
جستجوی با راهبرد عقبگرد:
یعني گره ای که در آن احتمال پاسخ وجود ندارد را باز نکنید و آن شاخه را از نقطهای که احتمال پاسخ
بودن را نقض ميکند ،هرس کنید ،که در این حالت خواهیم دید بسیاری از پردازشها با هرس کردن
شاخهها حذف خواهد شد.
به گرهای که احتمال رسیدن به پاسخ وجود داشته باشد« ،گره امید بخش» گفته ميشود.
با توجه به نکات باال پاسخ این مسأله به شکل زیر خواهد بود:
75
یعني:
1
2
4
3
76
ميتوان این مسأله را به مسأله nوزیر تعمیم داد.
تمرین :تابع Promisingرا به زبان فارسي توصیف کنید؛ یعني منظور از امید بخش بودن یک گره چیست؟
پاسخ :تفاضل شماره ستون فرزند ( )kو والد ( )iنباید از 1کمتر باشد؛ یعني:
مثال :از مجموعهی زیر ،زیر مجموعهای انتخاب کنید که جمع آنها 6شود:
}{2, 4, 5
77
همانطور که مشاهده ميکنیم درخت فضای حالت این مسأله بسیار پیچیده خواهد شد ،ميتوان مسأله را به
صورت درخت دودویي در نظر گرفت که در هر حال ،یکي از عناصر انتخاب ميشود یا نميشود؛ بنابراین
داریم:
78
این مسأله در رنگآمیزی نقطههای جغرافیایي یا سلولبندی شبکههای مخابراتي کاربرد دارد .برای به دست
آوردن پاسخ مسأله ،درخت فضای حالت را به صورت زیر رسم ميکنیم:
پس از ساخت گراف ،تکتکِ مسیرها بررسي ميشوند و با توجه به یالهای گراف تصمیم ميگیریم که این
مسیر پاسخگوی مسأله هست یا خیر .به طور مثال ،مسیر اول عبارت است از:
m1,m1,m1,m1
که قطعاً پاسخ مسأله نیست (چون طبق گراف نباید رنگ v1و v2یکسان باشد .مسیر دوم:
m1,m1,m1,m2
این نیز پاسخ درستي نخواهد بود و به همین صورت تمام مسیرها بررسي ميشود.
اما این گراف ميتواند طبق الگوریتم عقبگرد ،هرس شود و به طور مثال وقتي بعد از m1دوباره m1انتخاب
ميشود ،این شاخه« ،غیر امیدبخش» تشخیص داده شود و هرس شود و برگهای آن بررسي نشود...
مثال :نقشهی زیر حداقل به چند رنگ نیاز دارد تا مسأله M–Coloringدر مورد آن صدق کند.
79
بنابراین به یک مسأله M–Coloringتبدیل شد که باید درخت حالت مسأله آن را رسم کنیم .مسأله را
یکبار ،با یک رنگ حل ميکنیم ،که داریم:
سپس با دو رنگ:
80
اگر به همین صورت با دو ،سه و چهار رنگ ادامه دهیم ،به این نتیجه خواهیم رسید که فقط با چهار رنگ ،امکان
انتخاب رنگهایي وجود دارد که مجاور نباشد.
1
مسأله کولهپشتی: -8-4
صورت مسأله :فرض کنید قرار است یک جهانگرد از بین اشیاء زیر حداقل اشیائي را انتخاب کند که وزن
آنها بیش از 15کیلوگرم نشود و در عین حال سودمندترین اشیاء باشد( .منظور از ارزش هر شیئ میزان نیازمندی
جهانگرد به آن شیئ است)
برای حل مسأله ابتدا تناسب سود به وزن را به صورت زیر محاسبه ميکنیم:
4
= 𝑤1 = 0.3
12
2
= 𝑤2 =2
1
1
= 𝑤3 =1
1
10
= 𝑤4 = 2.5
4
2
= 𝑤5 =1
2
1
Knapsack
81
درخت فضای حالت را بهصورت زیر رسم میکنیم:
کولهپشتی کسری :در این دسته مسائل ميتوانیم ،کسری از یک شیئ را انتخاب کنیم.
82