طراحی الگوریتم ها 1
فصل اول :
الگوریتـم:
الگوریتم به روش حل هر دسته از مسائل گفته میشود. الگوریتم باید به صورت رشتهای از اعمال که حل دستهای از مسائل را به دقت تبیین مینماید، سازماندهی شده باشد؛ این اعمال جزعی باید بدون ابهام باشند و زمان اجرای متناهی داشته باشند.
ارزیابی کارایی الگوریتـمها:
جهت مقایسهی میزان کارایی هر الگوریتم احتیاج به معیارهایی است که دو معیار اساسی آن چنیناند.
I. زمان لازم برای اجرای کامل الگوریتم.
II. حداکثر میزان حافظهی لازم در زمان اجرای الگوریتم.
تذکر : توجه کنید که اگر یک الگوریتم را بوسیلهی دو کامپیوتر متفاوت، با تواناییها و سرعت غیر یکسان اجرا کنیم، دو زمان اجرای متفاوت خواهیم داشت. لذا بهتر است بجای معیارهای فوق از دو معیار زیر جهت ارزیابی و مقایسهی کارایی الگوریتمها استفاده نماییم.
I. مرتبهی زمانی اجرای کامل الگوریتم.
II. مرتبهی مکانی اجرای الگوریتم.
بر اساس تعریفهای مختلف جهت مرتبههای زمانی و مکانی کارایی الگوریتم بصورت ضریبی از تعداد اعمال کلیدی که تکرار آن بیشترین باشد و بیشترین وقت و حافظه کامپیوتر را به خود اختصاص دهد، سنجیده و محدود میگردد.
از این دسته میتوان به موارد زیر اشاره داشت.
1- تعریف نماد O :
اگر R ≥ 0→f : N آنگاه :
یعنی از یک جا به بعد برای هر n داریم
2- تعریف نماد Ω :
اگر R ≥ 0→f : N آنگاه :
نتیجه:
3- تعریف نماد :
نکته : وقتی گفته میشود زمان اجرای الگوریتم است یعنی الگوریتم هر جوری اجرا شود، مرتبهی زمانی اجرای آن یا n2است و یا از n2 کمتر است.
نکته : وقتی گفته میشود زمان اجرای الگوریتم است یعنی الگوریتم هر جوری اجرا شود مرتبهی زمانی اجرای آن n2یا بیشتر از n2 است.
نکته : وقتی گفته میشود زمان اجرای الگوریتم است یعنی الگوریتم هر جوری اجرا شود، مرتبهی زمانی اجرای آن دقیقاً n2 خواهد بود.
4- تعریف نماد o :
نادرست |
||
نادرست |
||
درست |
قضیهی ماکسیممها :
اگر آنگاه:
اثبات:
5- تعریف نماد :
نکته :
قضیه : اگر و
1- اگر آنگاه .
2- اگر آنگاه .
3- اگر آنگاه .
آنالیـزالگوریتمها
برای آنالیز هر الگوریتم از سه اصل زیر استفاده میشود.
1- اصل پایانی : اگر از یک الگوریتم دو پیاده سازی مختلف داشته باشیم که یکی زمان و دیگری زمان را نیاز داشته باشد در این صورت:
2- اصل ترتیبگذاری : اگر و دو قطعه برنامه مستقل باشند، زمان لازم برای اجرای متوالی و برابر خواهد بود.
3- اصل دستورات اتمی : منظور از یک دستور اتمی، دستورات مقدماتی در سطح ماشین است مثل دستور ، + ، - ، ، مقایسه، جایگزینی(انتساب) و ... ؛ این دستورات در سطح سخت افزار به زمانی در حد نیاز دارند.
آنالیز حلقهی While :
فرض کنید یک کران بالا برای دستورات جایگزینی، مقایسهای، جمع و عمل عددی چون باشد و کران بالا برای اجراهای متمایز عددی چون باشد. اگر زمان اجرای مجموعه دستورات فوق باشد داریم:
برای عمل جایگزینی برای مقایسه برای برای جایگزینی برای goto |
بدیهی است که اگر پراکندگی زمانی اجراهای متمایز زیاد باشد در این صورت
نکته : در سطح ماشین، دستور مانند است، لذا آنالیز یکسانی دارند.
آنالیز الگوریتم مرتب سازی حبابی (Bubble sort) :
Procedure BubbleSort ( )
در محاسبهی کران بالا، همواره فرض میکنیم که شرط برقرار است و دستور اجرا میشود. در این صورت زمان لازم برای مجموع این عملیات در حد زمان است.
I
محاسبهی کران پایین:
II
چند تعریف :
آنالیز الگوریتم مرتب سازی انتخابی (Selection sort) :
Procedure Select (T [1..n])
محاسبهی کران بالایی:
محاسبهی کران پایین:
مرتبهی زمانی اجرای الگوریتم انتخابی |
از مقایسهی دو الگوریتم مرتب سازی حبابی و مرتب سازی انتخابی، درکل فرقی با هم ندارند، ولی الگوریتم مرتب سازی انتخابی، در ضریب بدتر است.
آنالیز الگوریتم مرتب سازی درجی (Insert sort) :
Procedure insertion (T [1..n])
محاسبهی کران بالایی:
محاسبهی کران پایین:
کمترین زمان وقتی است که اصلاً اجرا نشود. یعنی زمان اجرای آن باشد.
زمان اجرای الگوریتم درجی
در حالی که کران بالایی و پایینی الگوریتمها متفاوت است معمولاً آنالیز هر الگوریتم را در سه حالت زیر انجام میدهیم.
1- آنالیز در بهترین حالت(Best case analysis)
یعنی ورودیها بگونهای باشند که الگوریتم کمترین زمان را ببرد.
2- آنالیز در بدترین حالت(Worst case analysis)
یعنی ورودیها بگونهای باشند که الگوریتم بیشترین زمان را سپری کند.
3- آنالیز در حالت متوسط(Average case analysis)
برای مثال در آنالیز مرتب سازی درجی اگر ورودیها بصورت صعودی، مرتب شده باشند بهترین حالت رخ میدهد. در این حالت زمان الگوریتم خواهد بود. اگر دادهها به شکل نزولی مرتب شده باشند بدترین حالت رخ میدهد که در این حالت زمان اجرای الگوریتم خواهد بود. محاسبهی حالت متوسط یعنی در حالت متوسط با ورودیهای مشخص زمان اجرا چه خواهد بود.
یکی از مشکلاتی که در آنالیز الگوریتمها وجود دارد، آنالیز در حالت متوسط است. در این گونه موارد در حالت کلی برای n داده، زمان لازم برای بدست آوردن ترتیبهای مختلف دادههاست که میتواند این n داده بعنوان ورودی در نظر گرفته شود و حالت میباشد.
بنابراین برای محاسبهی متوسط این حالت، زمانها را محاسبه کرده و جمع نموده و بر تعداد آنها تقسیم میکنیم. ولی از لحاظ منطقی نشدنی است، زیرا زمان لازم برای این عملیات است و این زمان خیلی خیلی زیاد است. بنابراین روش منطقیتر استفاده از روش آماری میباشد. در روش آماری از تکنیکهای خاص استفاده میکنیم. برای مثال در الگوریتم Insertion Sort از مفهوم Partial Rank (رتبهی جزئی) استفاده میکنیم. منظور از رتبهی جزئی عنصر از آرایهی عبارت است از محل قرار گیری در آرایهی پس از مرتب سازی زیر آرایهی . در این الگوریتم حلقهی while رتبهی جزئی عنصر را محاسبه میکند.
اگر متوسط زمان لازم برای قرارگیری عنصر ام در محل واقعی خود از زیر آرایهی باشد در این صورت
یک جابجایی یا دو جابجایی یا
مرتب سازی لانه کبوتری :
T |
2 |
3 |
1 |
2 |
1 |
3 |
2 |
1 |
4 |
|
U: |
0 |
0 |
0 |
0 |
| ||||||||||||||
|
|
1 |
2 |
3 |
4 |
| ||||||||||||||
|
|
| ||||||||||||||||||
3 |
3 |
2 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
3 |
4 | ||||||||
1 |
2 |
3 |
4 |
|
|
|
|
|
|
|
|
|
| |||||||
Procedure Pigeonhole (T [1..n])
*let , and are positive integer */
U
نکته : هیچ الگوریتم مرتب سازی که مبتنی بر مقایسه باشد زمان اجرای آن کمتر از نیست.
مرتب سازی مبنا (Radix Sort):
24 |
15 |
67 |
34 |
12 |
22 |
87 |
85 |
74 |
9 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Listnew |
List |
مرتبهی اجرا این الگوریتم میباشد که حداکثر تعداد ارقامی است که بین عدد موجود است.
Procedure RadixSort (int max List[1..n])
/*let , */
/*let Pointer */
/*let Pointer */
فصل دوم : برگشتپذیری و الگوریتمهای بازگشتی
برخی از زبانهای برنامهسازی این امکان را دارند که بتوانیم در آنها ساختار استقرایی را پیاده سازی نمائیم. منظور از ساختارهای استقرایی ساختارهایست که درآنها جهت دستیابی به یک عنصر لازم است یک، دو و یا چند عنصر دیگر را داشته باشیم و از آنها بصورت استقرایی به داده جدید دست یابیم. عملاً جهت اجرای یک قسمت از الگوریتم، احتیاج به بازگشت و اجرای همین الگوریتم با دادههای جدید میباشد. برای نوشتن الگوریتمهای بازگشتی باید به دو نکتهی زیر دقت شود.
I. باید یک شرط خروج داشته باشیم. یعنی باید بر حسب یک یا چند مقدار اولیه، تابع مذکور مشخص باشد.
II. فرض شود که الگوریتم برای مرحلهی قبل و یا مراحل قبل کار میکند و فقط باید آنرا برای این مرحله ارتقاء داد.
مثال :تابع فاکتوریل را بصورت بازگشتی بنویسید.
|
میدانیم | ||
|
نکته :دقت شود که در مورد ساختارهای بازگشتی پیچیده، معمولاً Trace کردن برنامه هم زمانبر است و هم ممکن است با بیدقتی انجام پذیرد. لذا بهتر است ابتدا رابطهی بازگشتی آنها را بدست آوریم.
توجه :یک روش جهت بررسی درستی الگوریتمهای بازگشتی استفاده از ساختار درختی است که میتواند با پشته پیاده سازی شود.
جهت بررسی زمانی الگوریتمهای بازگشتی میتوان از رابطهی بازگشتی آنها به معادلهی بازگشتی زمان اجرا دست یافت و با حل آن معادله به مرتبه زمانی این الگوریتمها رسید.
معادلات بازگشتی :
در یک معادلهی بازگشتی، مقدار هر جمله برحسب یک یا چند جملهی قبل محاسبه میشود. بطور کلی علاقهمند هستیم معادلات بازگشتی را مورد ارزیابی قرار دهیم که ضرایب آن ثابت و حقیقی باشند. این رده از معادلات را به دو دسته معادلات بازگشتی با ضرایب ثابت همگن و معادلات بازگشتی با ضرایب ثابت ناهمگن تقسیم میکنیم.
در معادلات همگن صفر است.
برای حل معادلات همگن بازگشتی با ضرایب ثابت به شکل زیر عمل میکنیم.
ابتدا معادلهی شاخص را بدست میآوریم. برای بدست آوردن معادلهی شاخص، هر را به تبدیل میکنیم، سپس ریشههای این معادله را بدست میآوریم.
معادلهی شاخص یا مفسر یا سرشتنمایی
ممکن است یکی از شرایط زیر رخ دهد:
I. معادله دارای k ریشهی حقیقی دوبهدو متمایز باشد. در این صورت جواب معادله به صورت زیر است.
II. اگر تمام ریشههای معادله حقیقی باشند و مثلاً یکی از ریشهها مانند تکراری از مرتبهی باشد(یعنی در تجزیهی معادله شاخص، عامل را داشته باشیم ولی عامل وجود نداشته باشد) در این صورت جواب معادله به فرم زیر است.
III. معادله دارای ریشهی موهومی باشد که در اینجا بحث نمیشود.
نکته :غیر از روش جامع فوق دو روش دیگر نیز وجود دارد که در مورد همه مسائل قابل استفاده نیست.
1- حدس زدن جواب رابطه و اثبات آن به روش استقراء
مثال: حدس
استقراء |
||
2- جایگزاری متوالی
مثال:
به نظر میرسد
مثال: مقدار چیست؟
|
| |
|
معادله شاخص | |
|
|
مثال :
|
||
جهت حل معادلات بازگشتی غیر همگن با فرم عمومی زیر داریم:
که در آن هر چند جملهای از درجهی است.در این صورت معادلهی مشخصه به صورت زیر است.
حال ریشههای معادلهی فوق را بدست میآوریم و مانند قبل عمل میکنیم.
مثال:
جهت حل معادلات غیر همگن میتوان از تغییر متغیر نیز استفاده کرد.
|
| |
|
مثال:
تقسیم میکنیم. n! طرفین معادله را بر
| ||
|
مثال:
بررسی چند الگوریتم بازگشتی :
برج هانوی :
سه میله با نامهای A،BوC داریم. فرض میشود درون یکی از این میلهها n دیسک قرار دارد. این دیسکها هرکدام دارای رنگ متمایز با دیگری میباشد. این n دیسک طوری قرار دارند که دیسکی با قطر بیشتر روی دیسکی با قطر کوچکتر قرار نگرفته است. میخواهیم این دیسکها رابه میلهی دیگری به کمک میلهی باقیمانده جابجا کنیم. در هر مرحله باید یک دیسک جابجا شود و در این جابجایی نباید دیسک بزرگتر روی دیسک کوچکتر قرارگیرد.
میخواهیم یک الگوریتم بازگشتی برای
جابجایی این n دیسک بنویسیم.
برای 2 مهره: |
|
برای 3 مهره: |
|
برای n مهره: |
Int tower(int n, peg A, peg B, peg C)
// BوA جابجایی مهرههای
| ||
|
مثال: آرایهای به طول n داریم میخواهیم عناصر و را در این آرایه محاسبه کنیم. حداقل تعداد مقایسههای لازم برای بدست آوردن عنصر و را بیابید.(طول آرایه را زوج فرض کنید و سپس برای طول فرد محاسبه کنید.)
زوج n: | |
|
: زوج n | |||
: فرد n
|
1 اول مقایسه با عنصر اول 1 دوم مقایسه با عنصر اول |
مثال: میخواهیم حاصلضرب ، Dماتریس را حساب کنیم. هر ماتریس است. میخواهیم این ماتریسها را پرانتزگذاری کنیم تا حاصل ضربهای مختلفی بدست آید. تعداد حالات مختلف پرانتزگذاری را بدست آورید.
|
با کمک استقراء میتوان ثابت کرد
مثال:فرض کنید کدی دهدهی با طول n زمانی معتبر است که تعداد صفرهای ظاهر شده در آن زوج باشد، میخواهیم رابطهی بازگشتی را بدست آوریم که تمام کدهای به طول n که معبتر هستند را بدست آورد.
است. تعداد ارقام حالات معتبر 9حالت
| ||
1 |
||
2 | ||
… | ||
9 |
تعداد رشتههای بطول است که تعداد صفرهایش فرد باشد.
|
مثال:
زمان این تابع
مثال: تعداد درختهای دودویی شامل n راس را بیابید.
مثال: درخت AVL: درخت دودویی است که اختلاف زیر درختان چپ و راست هرگره آن 0،1یا1- باشد. میخواهیم رابطهای بازگشتی بدست آوریم که حداقل تعداد گرههای یک درخت AVL به ارتفاعH را محاسبه نماید.
حداقل تعداد گرههای یک درختAVL به ارتفاعh
مثال: الگوریتم بازگشتی پیدا کنید که تمام زیر مجموعههای یک مجموعهی n عضوی را پیدا کنید.
فرض میکنیم مسئله برای n-1 عضو جواب میدهد، آنرا به n عضو تعمیم میدهیم. عضو nام را از مجموعه حذف میکنیم و تمام زیر مجموعههای زیر مجموعه n-1 عضوی را دوباره مینویسیم. ودر بار دوم که چاپ میکنیم عنصر nام را به آن اضافه میکنیم.
: تعداد حالات
| ||
| ||
|
مثال:
مثال:
فصل سوم : الگوریتمهای حریصانه (Greedy Algorithms) :
این دسته از الگوریتمها برای بدست آوردن یک جواب از مسئله همواره سعی میکنند که سادهترین و در عین حال پر ارزشترین انتخابها را انجام دهند. انتخاب این گزینهها در هر مرحله ممکن است باعث شود مسئله به بیراهه منجر شود و الگوریتم حریصانه بهترین جواب را برای مسئله اراده نکند یا اینکه ممکن است نتواند حتی یک جواب از مسئله را بدست آورد.
ساختار یک الگوریتم حریصانه مطابق شبهکد زیر است.
Function greedy(c: set): set;
بر اساس شبهکد مذکور هر الگوریتم حریصانه از اجزای زیر تشکیل شده است.
ü مجموعه C: مجموعهای ازتمام کاندیداهای ممکن که ممکن است به عنوان جواب مسئله انتخاب شوند.
ü مجموعه S: مجموعهایست که درنهایت قرار است به یک جواب از مسئله منتهی شود. در ابتدا تهی بوده و در نهایت در صورت وجود جواب به یک جواب از مسئله منجر میشود.
ü تابع Select: ورودی این تابع مجموعه C و خروجی آن عنصری از مجموعه C میباشد.
ü بدیهی است با انتخاب عنصری از C این عنصر از مجموعهای از کاندیدها یعنی C باید حذف شود. تابع Select با توجه به نوع Greedy که در مسئله تعریف میشود عمل مینماید.
ü تابع Solution: بررسی میکند که مجموعه S یک جواب از مسئله است یا خیر. ورودی آن مجموعه S و خروجی آن یک مقدار Boolean میباشد.
ü تابع Feasible: ورودی آن مجموعه S و عنصر انتخاب شده از مجموعه C بوسیلهی تابع Select است.این تابع بررسی میکند که ببیند آیا امکان اضافه شدن عنصر به مجموعه S وجود دارد یا خیر. نتیجهی این بررسی بصورت Boolean در خروجی تابع ظاهر میشود.
توجه کنید از آنجا که شبهکد تا زمانی تکرار میشود که یا به جواب برسد یا مجموعه C تهی شود، هیچگاه در حلقهی بینهایت گیر نمیکند، مگر آنکه مجموعهی انتخابی نا متناهی باشد.
بررسی چند مثال:
الگوریتم هافمن(Huffman Algorithm)
یکی از سریعترین الگوریتمها که میتواند یک فایل از علائم را zip کند این الگوریتم است. همچنین اجازهی unzip نمودن فایل حاصل را نیز میدهد. برای این منظور فایل ورودی کاراکتر به کاراکتر خوانده میشود. فراوانی هرکدام از کاراکترهای بدست آمده در جدولی به صورت صعودی قرار میگیرد. از روی این جدول درختی ساخته میشود که برگهای آن این کاراکترها باشد. حال هر دو برگی را که فرکانس کمتری دارد با هم merge میکنیم تا رأس جدید به عنوان ریشه آنها حاصل آید. فرکانس این نود برابر مجموع فرکانس دو نود جمع شده میباشد. اینکار را آنقدر ادامه میدهیم تا به ریشهی درخت برسیم. سپس از ریشهی درخت شروع کرده و برای فرزندان راست برچسب 1 و برای فرزندان چپ برچسب 0 را روی یالها در نظر میگیریم. به این ترتیب هر یک از کاراکترها دارای یک برچسب با کد باینری خواهد بود.
مثال: فرض کنید متنی شامل 7000 حرف الفبایی داریم که 6200تای آن حرف a، 1800تای آن حرفb، 900تای آن حرف c، 1100تای آن e، 1800تای آن حرف d و 200 تای آن حرف m میباشد. میخواهیم بدانیم برای zip کردن این متن حداقل چند بیت لازم حافظه است؟
00 |
: |
a |
01 |
: |
b |
1000 |
: |
c |
1001 |
: |
m |
101 |
: |
e |
11 |
: |
d |
حداقل تعداد بیتهای لازم :
بدون فشردهسازش :
الگوریتمهای درخت پوشای مینیمال(Minimum Spanning Tree-MST):
فرض کنید گراف یک گراف همبند باشد (یعنی بین هردو رأس متمایز آن یک مسیر وجود داشته باشد) منظور از یک درخت پوشا از این گراف درختی است که شامل همه رئوس این گراف باشد ولی فقط بعضی از یالهای آنرا دربر گیرد. منظور از درخت پوشای مینیمم (برای گرف همبند وزندار) درختی است که بین درختهای پوشای آن گراف، مجموع وزن یالهای آن، کمترین مقدار ممکن باشد.
بطور کلی دو الگوریتم برای درخت پوشای مینیمم وجود دارد که عبارتند از الگوریتمهای Kruskal و Prim.
مثال:
Step |
Edge Considered |
Connected Component |
Initialization |
--------- |
|
1 |
||
2 |
||
3 |
||
4 |
||
5 |
||
6 |
||
7 |
نحوهی کار الگوریتم Kruskal به این صورت است که یک جنگل از درختهارا به ترتیب با هم ادغام میکند تا به یک درخت واحد برسد.
الگوریتم prim:
minimum
Step |
{u,v} |
B |
initialization |
----- |
|
1 |
||
2 |
||
3 |
||
4 |
||
5 |
||
6 |
ü ممکن است درختهایی که الگوریتم مذکور تولید میکنند، از لحاظ شکل ظاهری متفاوت باشند، ولی وزن همهی درختها یکسان است.
ü مرتبهی زمانی الگوریتم برابر است. (حلقهی دفعه و عمل یافتن از میان لبههای متصل به یک مجموعه دور خاص دفعه اتفاق میافتد؛ که در مجموع برابر دفعه میشود).
ü مرتبهی زمانی الگوریتم برابر میباشد.(این زمان مربوط به مرتبسازی لبهها میباشد).
ü اگر گراف ورودی شلوغ باشد، یعنی تعداد یالهای گراف زیاد باشد است، در این صورت زمان الگوریتم برابر است. در حالیکه زمان الگوریتم برابر میباشد، پس الگوریتم بهتر است. اگر گراف ورودی اسپارس(خلوت) باشد، یعنی تعداد یالها کم باشد زمان الگوریتم برابر و زمان اجرای الگوریتم برابر میباشد پس الگوریتم دراین حالت بهتر است.
مطالب مشابه :
دانلود جزوه طراحی الگوریتم
دانلود جزوات دانشگاهی - دانلود جزوه طراحی الگوریتم - دانلود جزوات دانشگاهی
آموزش طراحی الگوریتم به صورت تصویری
حدود 3 سال قبل یک آموزش از طراحی الگوریتم گذاشتم که متاسفانه نیمه کاره ماند در این قسمت به
طراحی الگوریتم ها 1
فصل اول : الگوریتـم: الگوریتم به روش حل هر دسته از مسائل گفته میشود. الگوریتم باید به صورت
طراحی الگوريتم ها؛ ويراست نهم - بهار 1394
eBoard - طراحی الگوريتم ها؛ ويراست نهم - بهار 1394 - برد الكترونیكی دروس
طراحی الگوریتم ها 3
مثال : الگوریتم Cycle : فرض کنید گرامر مستقل از متن مفروض باشد که در فرم فرمال چاسکی صدق نماید
طراحی الگوریتم ها جلسه چهارم
مقالات و جزوه های درسی رشته کامپیوتر - طراحی الگوریتم ها جلسه چهارم - جزوه ، مقاله ، پروژه
طراحی الگوریتم
آنلاین - طراحی الگوریتم - همیشه آنلاین باشید . در این قسمت دانلود یک فایل آموزشی در زمینه
برچسب :
طراحی الگوریتم