طراحی الگوریتم ها (طراحی و تحلیل الگوریتم ها)
به مجموعه قوانینی که بیانگر سلسله مراتب انجام یک فرآیند هستند الگوریتم گفته می شود و در زمینههای مختلفی در علوم و فنون مهندسی و غیر مهندسی کاربرد دارد.
درس طراحی و تحلیل الگوریتمها یکی از پایهایترین درسها در رشته علوم کامپیوتر و مهندسی کامپیوتر بهحساب میآید و یادگیری آن نسبتا سخت است. هدف از این درس، مطالعه و بررسی روشهای طراحی الگوریتمها برای حل مسائل مختلف و چگونگی تحلیل و اثبات درستی آنها است. همچنین دستهبندی مسائل و شناسایی مسائل محاسباتی سخت که در زمان قابلقبول نمیتوان جواب آنها را به دست آورد، نیز پوشش داده میشود.
مطالعه این درس برای کنکور کارشناسی ارشد و دکتری از اهمیت بالایی برخوردار است.
در طراحی الگوریتمها مباحثی همچون پیچیدگی زمانی، بازگشتی، روش تقسیم و غلبه، روش حریصانه، روش برنامهسازی پویا، تکنیک عقبگرد، نظریه P و NP مطالعه میشود.
برای نوشتن الگوریتم، ابتدا موارد زیر بهعنوان پارامترهای پیشنیاز باید مشخص شود:
- تعریف واضح مسئله و مشکلی که قرار است با این الگوریتم حل شود.
- تعیین محدودیتهای مسئله.
- ورودی های مسئله.
- خروجی مورد انتظار.
تجزیه و تحلیل الگوریتم بخش مهمی از نظریه پیچیدگی محاسباتی (پیچیدگی زمانی و پیچیدگی حافظه) است و منابع مورد نیاز یک الگوریتم را برای حل یک مشکل محاسباتی خاص ارائه میدهد. در واقع تجزیه و تحلیل الگوریتم ها تعین مقدار منابع زمانی و مکانی مورد نیاز برای اجرای آن است.
روش های ارزیابی الگوریتم به صورت زیر است:
- بهترین حالت الگوریتم: بهترین حالت الگوریتم زمانی است که ورودی را طوری تعریف کنیم که ورودی الگوریتم برای آن زمان کمتر یا حداقل زمان نیاز دارد. در بهترین حالت، حد پایین یک الگوریتم محاسبه میشود.
برای مثال در جستجوی خطی وقتی دادههای جستجو در اولین مکان دادهها وجود دارد، بهترین حالت رخ میدهد.
- بدترین حالت: بدترین حالت زمانی است که ورودی را طوری تعریف کنیم که الگوریتم برای آن زمان طولانی یا حداکثر زمان نیاز دارد. در بدترین حالت، حد بالایی یک الگوریتم محاسبه میشود
برای مثال در جستجوی خطی وقتی دادههای جستجو اصلاً وجود ندارد، بدترین حالت رخ میدهد.
- حالت متوسط: در حالت متوسط، تمام ورودیهای تصادفی انتخاب میشوند و زمان محاسبه برای همه ورودیها محاسبه میشود و سپس آن را بر تعداد کل ورودی ها تقسیم میشود.
انواع الگوریتم
چندین نوع الگوریتم موجود است، برخی از الگوریتمهای مهم عبارتاند از:
الگوریتم بازگشتی (Recursive algorithm)
این نوع الگوریتم مبتنی بر بازگشت است. در بازگشت، یک مشکل با شکستن آن به مسائل فرعی از همان نوع و فراخوانی دوباره و دوباره خود تا زمانی که مشکل با کمک یک شرط پایه حل شود، حل میشود. برخی از مسئله های رایج که با استفاده از الگوریتمهای بازگشتی حل میشوند عبارتاند از فاکتوریل، سری فیبوناچی و برج هانوی.
الگوریتم تقسیم و حل (Divide and Conquer)
در این الگوریتم ایده این است که مسئله را در دو بخش حل کنیم، بخش اول مسئله را به مسائل فرعی از همان نوع تقسیم میکند. بخش دوم این است که مسئله کوچکتر را بهطور مستقل حل کنید و سپس نتیجه ترکیبی را برای ایجاد پاسخ نهایی به مسئله اضافه کنید. برخی از مشکلات رایج که با استفاده از الگوریتمهای تقسیم و غلبه حل میشوند عبارتاند از جستجوی دودویی، مرتبسازی ادغامی، مرتبسازی سریع، ضرب ماتریس استراسن و غیره.
الگوریتمهای برنامهنویسی پویا (Dynamic programming)
این نوع الگوریتم همچنین بهعنوان تکنیک حافظه سازی شناخته میشود، زیرا در این ایده، ذخیره نتیجه محاسبه شده قبلی برای جلوگیری از محاسبه مجدد آن است. در برنامهنویسی پویا میتوان مسئله پیچیده را به زیرمشکل های کوچکتر همپوشانی تقسیم کرد و نتیجه را برای استفاده در آینده ذخیره کرد.
مشکلات زیر را میتوان با استفاده از الگوریتم برنامهنویسی پویا حل کرد:
- مسئله کولهپشتی
- زمانبندی کار وزندار
- الگوریتم فلوید وارشال
الگوریتمهای حریصانه (Greedy algorithms)
در الگوریتم حریصانه، راهحل قسمت به قسمت ساخته میشود. تصمیمگیری برای انتخاب قسمت بعدی بر این اساس انجام میشود که فواید آن را به همراه دارد. هرگز به انتخابهایی که قبلاً انجامشده بود توجه نمیکند.
برخی از مشکلات رایجی که میتوان از طریق الگوریتم حریصانه حل کرد عبارتاند از: الگوریتم کوتاهترین مسیر Dijkstra، الگوریتم Prim، الگوریتم Kruskal، کدگذاری هافمن.
الگوریتم عقبگرد (Backtracking)
در الگوریتم عقبگرد مسئله به روش افزایشی حل میشود، یعنی یک تکنیک الگوریتمی برای حل مسائل بهصورت بازگشتی با تلاش برای ساختن راهحلی بهصورت تدریجی. برخی از مسائل رایجی که میتوان از طریق الگوریتم Backtracking حل کرد عبارتاند از: چرخه همیلتونی، مسئله رنگآمیزی گراف.
الگوریتم تصادفی (random algorithm)
در الگوریتم تصادفی، از یک عدد تصادفی استفاده میکنیم. این به تصمیمگیری در مورد نتیجه مورد انتظار کمک میکند. برخی از مشکلات رایجی که میتوان از طریق الگوریتم تصادفی حل کرد عبارتاند از مرتبسازی سریع، مرتبسازی انتخابی و سایر موارد.
الگوریتم مرتبسازی (Sorting algorithm)
الگوریتم مرتبسازی برای مرتبسازی دادهها به ترتیب صعودی یا نزولی استفاده میشود. همچنین برای مرتبسازی دادهها به شیوهای کارآمد و مفید این الگوریتم بسیار حائز اهمیت است. برخی از مشکلات رایجی که از طریق الگوریتم مرتبسازی قابلحل هستند عبارتاند از: مرتبسازی حبابی، مرتبسازی درجی، مرتبسازی ادغامی، مرتبسازی انتخابی و مرتبسازی سریع نمونههایی از الگوریتم مرتبسازی هستند.
الگوریتم جستجو (Search algorithm)
الگوریتم جستجو الگوریتمی است که برای جستجوی کلید خاص در دادههای مرتبشده یا مرتبنشده خاص استفاده میشود. برخی از مشکلات رایجی که از طریق الگوریتم جستجو قابلحل هستند عبارتاند از جستجوی باینری (جستجوی دودویی) یا جستجوی خطی یکی از نمونههای الگوریتم جستجو است.
الگوریتم هش (Hash algorithm)
الگوریتمهای هش مانند الگوریتم جستجو کار میکنند، اما حاوی یک شاخص با شناسه کلید، یعنی یک جفت کلید-مقدار هستند. در هش کردن، یک کلید به دادههای خاصی اختصاص میدهیم. برخی از مشکلات رایج را میتوان از طریق الگوریتم هشینگ در تأیید رمز عبور حل کرد.
درس طراحی الگوریتم ها یک درس 3 واحدی و دارای پیش نیازهای ساختمان داده ها و الگوريتم ها و رياضيات گسسته می باشد. این درس در دسته “تخصصی مشترک” قرار دارد و در هنگام تطبیق واحد می توان این درس را جزء هر کدام از بسته های تخصصی در نظر گرفت.
در ادامه به معرفی نمونه سوالات دانشگاه پیام نور می پردازیم. این نمونه سوالات می تواند به یاگیری عمیق و بهتر شما از این درس کمک کند.
کارشناسی
کارشناسی
علاوه بر دوره های بالا با جستجو در سایت از طرق کد درس و یا نام درس می توانید ده ها دوره دیگر مرتبط با درس مورد نظر خود را بیابید و با دانلود نمونه سوالات پیام نور و بررسی آن نمره بالاتری را کسب کنید.
جهت بازدید از فروشگاه سایت می توانید از لینک زیر استفاده کنید.
طراحی الگوریتم ها طراحی الگوریتم ها طراحی الگوریتم ها طراحی الگوریتم ها طراحی الگوریتم ها