الگوریتم‌های تقسیم و تسخیر

الگوریتم‌های تقسیم و تسخیر، پیاده‌سازی ساده‌ای دارند. این به شما امکان می‌دهد الگوریتم را به‌طور گام‌به‌گام بسازید. راهکار مذکور الگوریتم را به منظور مقابله با مشکل، به روش‌های مختلف تجزیه می‌کند و درنتیجه می‌توانید مشکل را به چندین تکنیک تقسیم کنید و خروجی معتبری را از ورودی معتبر به‌دست آورید. این خروجی دقیق سپس به عملکردی متفاوت انتقال می‌یابد.

الگوریتم‌های Brute Force

این الگوریتم‌ها با استفاده از چارچوب منطق عمومی طراحی می‌شوند. علاوه‌براین Brute Force به‌عنوان الگوریتم‌های جست‌وجوی جامع نیز شناخته می‌شوند زیرا قبل‌از تصمیم‌گیری درمورد راهکار، همه‌ی راه‌حل‌های ممکن را بررسی می‌کند. الگوریتم‌های Brute Force در دو نوع طراحی می‌شوند:

۱. Optimizing: اگر بهترین پاسخ کشف شود، فرآیند یافتن همه‌ی راه‌حل‌های قابل اجرا برای مشکل و سپس انتخاب بهترین راهکار پایان می‌یابد.

2. Sacrificing: به‌محض کشف بهترین پاسخ پایان می‌یابد.

الگوریتم‌های تصادفی

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

الگوریتم‌های شاخه و کران

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

الگوریتم‌های حریص

در الگوریتم‌های حریص، هر تکرار بهترین تصمیم ممکن را برای یافتن نتیجه‌ی بهینه می‌گیرد. راه‌اندازی و استفاده این الگوریتم آسان بوده و تکمیل آن به زمان کمتری نیاز دارد. به‌هرحال، فقط چند مورد وجود دارد که در آن‌ها استفاده از الگوریتم‌ حریص بهترین گزینه است.

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

نوعی فرایند الگوریتمی که راهکاریی که نیازهای مشکل را برآورده نمی‌سازند، به‌طور مکرر کنار می‌گذارد.

الگوریتم‌های برنامه‌نویسی پویا

با ذخیره‌ی نتایج میانی، عملکرد الگوریتم را بهبود می‌دهد و برای شناسایی بهترین پاسخ برای حل مسئله، پنج مرحله را طی می‌کند:

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

۲. پس‌ از تفکیک مسئله به مشکلات کوچک‌تر، راه‌حل بهینه را برای آن‌ها پیدا می‌کند.

۳. فرایند به‌ خاطر سپردن که به حفظ نتایج مسائل کوچک‌تر اشاره دارد.

۴. برای جلوگیری از محاسبه‌ی مجدد راه‌حل برای مشکلات فرعی مشابه، مجدداً از آن استفاده می‌کند.

۵. درنهایت خروجی برنامه‌ی پیچیده محاسبه می‌شود.

فاکتورهای الگوریتم

هنگام ایجاد الگوریتم، باید فاکتورهای زیر را مدنظر قرار دهید:

  • ماژولار بودن (Modularity):‌ هنگامی‌ که مشکل بزرگی را به مسائل کوچک‌تر تقسیم کنید؛ درواقع از آن‌ها به‌عنوان توضیح اولیه‌ی الگوریتم استفاده کرده‌اید.
  • درست‌بودن (Correctness): درستی الگوریتم زمانی تعریف می‌شود که ورودی‌های ارائه‌شده، نتیجه‌ی موردانتظار را ایجاد می‌کنند؛ به بیان دیگر نشان می‌دهد الگوریتم با موفقیت توسعه یافته و تجزیه‌وتحلیل آن به‌پایان رسیده است.
  • قابلیت نگه‌داری (Maintainability): نشان می‌دهد الگوریتم باید به‌شیوه‌ای ساده و سازمان‌یافته ساخته شود تا زمانی‌ که روش دوباره تغریف شود، هیچ تغییر اساسی در راهکار ایجاد نخواهد شد.
  • کارکرد (Functionality): تعدادی از مراحل منطقی را برای حل موقعیتی در دنیای واقعی، مدنظر قرار می‌دهد.
  • استحکام (Robustness): ظرفیت الگوریتم برای توضیح صحیح مشکل را استحکام می‌گویند.
  • کاربرپسند بودن (User-friendly): اگر درک روش مشکل باشد، طراح الگوریتم اطلاعات درستی به برنامه‌نویس منتقل نمی‌کند.
  • سادگی (Simplicity): وقتی الگوریتمی به‌عنوان پایه در نظر گرفته شود، درکش آسان خواهد بود.
  • توسعه‌پذیری (Extensibility): اگر طراح یا برنامه‌نویس الگوریتم دیگری بخواهد از الگوریتم شما استفاده کند، باید قابلیت گسترش داشته باشد.
  • تجزیه‌وتحلیل الگوریتم