یک مجموعه دقیق از دستورالعملهای مرتبط با یک مسئله است که به منظور حل آن ایجاد شده است. در واقع یک روش خاص برای حل یک مسئله است که در قالب مراحل و مرحلههای خاص تعریف میشود. به طور کلی الگوریتمها برای انجام کارهایی مانند مرتبسازی دادهها، جستجو در دادهها، پردازش تصویر، تشخیص الگو، رمزگشایی و یا حل مسئلههای ریاضی استفاده میشوند.
هدف اصلی الگوریتم ارائه یک راهحل دقیق، خطی و قابل تکرار برای حل یک مسئله است. در واقع، با استفاده از یک الگوریتم میتوان یک مسئله را به یک سری مراحل ساده تقسیم کرد و به طور مرحله به مرحله، آن را حل کرد. آنها معمولاً در علوم کامپیوتر، ریاضیات، مهندسی و صنایع استفاده میشوند و در طراحی و توسعه نرمافزار، مجموعهای از الگوریتمها میتواند برای بهینهسازی کد و حل مسئلههای مشابه استفاده شود.
ما در دنیایی زندگی میکنیم که گرچه رایانهها در لحظه لحظه زندگی ما نفوذ کردهاند اما درک دقیقی از کارکرد آنها وجود ندارد. با این حال یک حوزه در علوم رایانه وجود دارد که هر فردی میتواند مبانی آن را درک کند. این زمینه از دانش رایانه به نام برنامهنویسی شناخته میشود.
برنامهنویسی صرفاً یک عنوان شغلی جذاب محسوب نمیشود بلکه مبنای همه نرمافزارهای رایانهای از آفیس مایکروسافت تا نرمافزارهای سخنگوی تلفنی است. حتی اگر دانش شما از برنامهنویسی تنها منحصر به فیلمهای خیلی قدیمی و گزارشهای خبری زرد باشد، احتمالاً متوجه هستید که کار یک برنامهنویس چیست. برنامهنویس کدی را برای رایانه مینویسد و رایانه با استفاده از دستورالعملهای تعریف شده آن کد وظایفی را برای حل مسائل اجرا میکند.
دنیای کامپیوتر پر از کلمات کلیدی مانند هوش مصنوعی، ابررایانه، یادگیری ماشین، محاسبات کوانتومی و خیلی از لغات دیگر است اما شاید در این میان، کلمه الگوریتم جزو یکی از واژگان پرتکرار و معروف در علم کامپیوتر است. ما در بخش بلاگ سایت برخی از این مفاهیم را در قالب یک مقاله کامل تعریف کرده ایم که می توانید با کلیک روی کلمات لینک شده به آنها دسترسی پیدا کنید.
در کلیترین مفهوم، مجموعهای از دستورالعملها است که به رایانه میگوید، چگونه مجموعهای از حقایق جهان را به اطلاعات مفید تبدیل کند. از مرتبسازی مجموعه اعداد گرفته شده تا یافتن مسیرها از طریق نقشه و حتی نمایش اطلاعات بر روی صفحه نمایش نمونههایی از اجرای یک الگوریتم خاص هستند.
۱- مراحل را به ترتیب و پشت سر هم بنویسید یعنی اجرا از بالا به پایین باشد.
۲- قدمهای ضروری را در نظر گرفته و آنها را در طرح خود به کار ببرید.
۳- از بیان جزئیات بیهوده پرهیز کرده و سعی کنید تا حد امکان مراحل را ساده و در عین حال کامل بنویسید.
۴- از زبانی ساده برای نوشتن الگوریتم استفاده کنید طوری که افراد مختلف برداشت متفاوتی از آن نداشته باشند.
۵- هر الگوریتم تنها یک نقطه شروع دارد که اولین دستورالعمل از آن شروع میشود، ولی میتواند چندین پایان داشته باشد.
۶- جامع باشد طوری که در حالتهای خاص نیز نتیجهی مناسب را به شما بدهد.
۷- اولویت عملگرهای ریاضی را هنگام نوشتن طرحتان در نظر داشته باشید به عنوان مثال محاسبه حاصل ضرب نسبت به محاسبه حاصل جمع در اولویت است.
بازگشتی حالت پایه مسئله را حل کرده و سپس با استفاده از این جواب، به حل مسائل تودرتو میپردازند. درواقع مسئله به چند بخش کوچک شکسته میشود که با استفاده از پاسخ مرحله قبل، مسئله بعدی قابلحل است.
از پویا یا دینامیک میتوان برای محاسبه بخشی از برنامه و استفاده از پاسخ آن در مسائل آینده استفاده کرد. یعنی از پاسخهای یک بخش میتوانید برای حل مسائل دیگر نیز بهره برد. دنباله فیبوناچی از نوع دینامیک استفاده میکند.
عقبگرد به دنبال پیدا کردن سرنخهای امیدبخشی است تا بهینهترین جواب را پیدا کند. این شیوه برای حل مسائل درخت فضای آن مسئله را ایجاد کرده و تعیین میکند کدام گره امیدبخش است. همچنین از علامتهایی برای بیان اینکه یک راهحل کاندید به حل مسئله نمیانجامد استفاده میکنند.
تقسیم و حل ابتدا مسئله را با توجه به نوع آن، چند بخش کوچکتر تقسیم کرده و به حل آنها میپردازند. سپس از ترکیب پاسخ بخشهای کوچکتر، پاسخ کلی مسئله بهدست میآید. برخی از روشهای مرتبسازی مانند مرتبسازی ادغامی و مرتبسازی سریع نیز از این دسته الگوریتمها محسوب میشوند.
بهعنوان مثال مرتبسازی ادغامی ابتدا آرایهای از مقادیر ورودی را دو قسمت کرده و بهصورت بازگشتی، دوباره هر قسمت را دو قسمت میکند. این روند آنقدر ادامه پیدا میکند تا اعداد در دستههای کوچکتر صعودی یا نزولی مرتب شوند. سپس از ادغام زیر بخش های کوچک، آرایه مرتبشدهی بخشهای بزرگتر به دست میآید.
حریصانه به دنبال جستجوی بهینهترین پاسخ ممکن هستند اما لزوماً در هر مسئلهای، نمیتوانند بهینهترین پاسخ را پیدا کنند اما یکی از جوابهای بهینه را به شما معرفی خواهند کرد. البته برخی مسائل هم بهطورکلی پاسخ بهینه ندارند که به آنها مسائل NP complete میگویند. در شیوه حریصانه در هر مرحله عنصری که بر مبنای معیارها بهترین به نظر میرسد، بدون توجه به انتخابهایی که قبلاً انجام شده یا در آینده انجام خواهد شد، انتخاب میشود.
جستجوی جامع یا بروت فورس تمامی راهحلهای احتمالی را بررسی میکند تا بتواند بهینهترین پاسخ را پیدا کند. همچنین بهینهترین پاسخ با ویژگی “ارضا کردن شرط مسئله” سنجیده میشود و به همین دلیل بیشتر برای مسائل کوچک کاربرد دارد و در رمزگشایی نیز کاربرد زیادی دارد و عملکرد آن بهگونهای است که تمامی کلیدها را چک میکند تا به جواب برسد.
فلوچارت یا روندنما، نموداری است که یک فرآیند، یک سیستم کامپیوتری را به صورت تصویری نشان میدهد. این نمایش نموداری یکی از راه حل مسئله است و تجزیه و تحلیل مراحل ضروری برای حل مسئله را ارائه میدهد. این مفهوم برای اولین بار در سال 1921 به عنوان نمودار فرآیند جریان برای اعضای انجمن مهندسین مکانیک آمریکا معرفی شد و در محاسبات اولیه در دهه 50 بسیار محبوبیت گردید.
به یاد داشته باشید که فلوچارت فقط توضیح میدهد که در هر مرحله چه اتفاقی باید بیفتد، چه ورودی لازم است و خروجی آن مرحله چیست، اما چیزی در مورد نحوه اجرای مرحله نمیگوید. هنگامی که یک فلوچارت رسم میشود، به یافتن ویژگیهای کمتر آشکار فرآیند کمک میکند و سپس میتواند برای بهبود کارایی آن اصلاح شود، مانند نقص ها، مراحل غیر ضروری، نقاط خطاخیز و…. یک فلوچارت باید به عنوان یک نمودار تکامل یافته دیده شود.
۱- واضح و بدون ابهام
۲- دارای ورودیهای مشخص
۳- دارای خروجیهای مشخص شده
۴- محدود بودن
۵- امکانپذیری
۶- مستقل از زبان