اگر به خوبی با مفهوم الگوریتمهای برنامهنویسی آشنا باشید، میتوانید بهسادگی منطق برنامهی خود را نوشته و آن را به کدهای برنامهنویسی تبدیل کنید، در این نوشته، با زیربنای زبانهای برنامهنویسی، یعنی الگوریتمها آشنا میشویم.
اگر بخواهیم براساس آن چه که در مقالات مختلف آمده است، الگوریتم برنامهنویسی را تعریف کنیم، باید بگوییم الگوریتم مجموعهای از دستورالعملهای مختلف است که دارای ترتیب خاصی بوده و منجر به حل مسائل پیشبینی شده میشوند. به بیان سادهتر الگوریتم یک روش مرحلهای برای حل مسائل است؛ بهعنوان مثال محاسبه معدل دانشگاه نیز نوعی الگوریتم محسوب میشود.
اما اگر بخواهیم این موضوع را به زبان برنامهنویسها تعریف کنیم، باید گفت بعد از تعیین اهداف و وظایف نرمافزار و تشخیص این مسئله که نرمافزار قرار است چه خدماتی به کاربران ارائه دهد، باید مراحلی برای آن تعریف شوند؛ در نهایت انجام این مراحل منجر خواهند شد که آن هدف نهایی انجام شود. به این مراحل که نحوه عملکرد نرمافزار یا سایت را مشخص میکنند، الگوریتم میگوییم. به عبارت دیگر الگوریتم همان راهکارهای حل مسائل در برنامهنویسی است.
بنابراین پیش از هر چیز باید آگاهی داشته باشیم که نرمافزار ما قرار است چه کاری را انجام دهد. سپس بخش دشوار و تخصصی آغاز میشود که باید به سیستم دستوراتی بدهیم که کارها براساس آن انجام شوند. مطمئنا هر چقدر وظیفه خواسته شده از یک نرمافزار پیچیدهتر و دشوارتر باشد، تعداد خطوط کدهای نوشته شده نیز بیشتر خواهند بود؛ در نتیجه الگوریتم پیچیدهتری ایجاد خواهد شد.
برای درک بیشتر قصد داریم یک نمونه الگوریتم بسیار ساده را فرض کنیم که باید حاصل جمع دو عدد را چاپ کند؛ بنابراین الگوریتم به شکل زیر خواهد بود:
شروع الگوریتم دریافت عدد اول دریافت عدد دوم جمع عدد اول و دوم چاپ حاصل جمع پایان الگوریتمالبته این یک مثال بسیار ساده از الگوریتمهای برنامهنویسی بود، همانطور که گفتیم، هرچه یک برنامه پیچیدهتر باشد، الگوریتم پیچیدهتری نیز خواهد داشت، اگر علاقهمندید با مثالهای حرفهایتری در خصوص الگوریتمهای برنامهنویسی آشنا شوید، کافی است عبارت «مثال الگوریتم» را در گوگل جستوجو کرده و وارد وبسایت «همیار آیتی» شوید.
چه مسائلی در الگوریتم رعایت میشوند
تمامی الگوریتمها با هر هدفی، دارای برخی ویژگیها و خصوصیات کلی هستند که درادامه قصد داریم به توضیح آنها بپردازیم.
ورودی
برخی الگوریتمها باید بهعنوان ورودی چند پارامتر را بپذیرند، البته این مورد درباره تمام آنها صدق نمیکند.
خروجی
الگوریتمها باید بهعنوان خروجی یا همان نتیجه عملیات، حداقل یک کمیت ایجاد کنند.
قطعیت
دستورها الگوریتم باید به شکلی دقیق و بدون ابهام نوشته شوند تا سیستم دچار اشکال نشود. در واقع هر دستورالعملی که صادر میشود باید قابلیت اجرا داشته باشد. بهعنوان مثال دستوری مانند «عدد ۸ را به X اضافه کنید» کاملا مبهم است زیرا مشخص نیست که در نهایت چه عددی باید به ۸ اضافه شود.
محدودیت
هر الگوریتمی باید یک شروع و پایان داشته باشد، بهطوریکه با دنبال کردن دستورها آن برای هر حالتی و اتمام دستورها، نتیجه کار مشخص شود. همچنین برای پایان الگوریتم باید یک زمان کوتاه و منطقی در نظر گرفت.
حال که با خصوصیات الگوریتم آشنا شدید، بهتر است اطلاعاتی نیز درباره ساختار منطقهای آن داشته باشید که درادامه مطلب آن را بیان میکنیم.
دنبالهای: در این گونه ساختار، تمام مراحل رسیدن به نتیجه مشخص شدهاند. شاخهای: چنین ساختاری براساس قانون «اگر» عمل میکند؛ به عبارت دیگر نتیجه نهایی به شروط مشخصی ارتباط دارد، بهعنوان مثال زوج و فرد بودن عدد میتواند نوعی شرط محسوب شود. حلقهای: نتیجه نهایی این الگوریتم به چند شرط مشخص بستگی دارد و پس از اتمام شرط، برنامه به پایان میرسد که این یعنی ساختاری تکراری.صفر تا صد اجرای الگوریتم
در این بخش قصد داریم با چرخه عمر الگوریتم از طراحی تا تولید آن آشنا شویم.
طراحی: در ابتدا با توجه به نیاز و اهداف سیستم، باید الگوریتم طراحی شود که این کار دارای روشهای مختلفی است. اثبات درستی: حال باید مشخص شود که آیا الگوریتم طراحی شده عملکرد درستی دارید یا خیر. بنابراین باید به ازای ورودی درست، خروجی سالم و پیشبینی شدهای بدهد. تحلیل: منظور از تحلیل این است که الگوریتم تا چه اندازه دارای پیچیدگی زمانی و مکانی است. پیادهسازی: حال باید با یک زبان برنامهنویسی مشخص، کدهای الگوریتم نوشته شوند. تست برنامه: مرحله نهایی خود شامل دو مرحله میشود که یکی مربوط به رفع اشکالات موجود و دیگری برای تشخیص میزان کارایی هستند.برنامهنویس موفق باید انواع الگوریتمها را بشناسد
با توجه به مطالب گفته شده، اکنون درک درستی از چیستی الگوریتم دارید و میدانید به چه شکل عمل میکنند. حال قصد داریم انواع الگوریتمها را از نظر نوع مسئله معرفی کنیم.
الگوریتمهای بازگشتی
در الگوریتمهای بازگشتی، اجرای برخی کدها باعث فراخوانی همان الگوریتم خواهد شد. روش کار این الگوریتم به شرح زیر است:
در قسمت اول یا حالت پایه، دیگر فراخواندن تابع به شکل بازگشتی انجام نمیشود و مقدار تابع را از همان اول در قسمت دوم، یکسری دستورالعملها اعمل میشوند که به کوچک شدن مسئله کمک میکنند و در این حالت تابع را با مقدار جدیدی فرا میخوانیم در قسمت سوم، بخشی از تابع را با مقداری جدید فرا میخوانیمبهتر است یک مثال از جهان واقعی برای شما بیاوریم تا بهتر این الگوریتم را درک کنید. فرض کنید میخواهیم یک الگوریتم برای رسیدن به منزل خود داشته باشیم. بنابراین حالت پایه آن به این صورت خواهد بود که اگر در خانه باشیم، کاری انجام نخواهیم داد. قسمت دوم آن باید به ساده شدن مسئله کمک کند، یعی اگر خارج از منزل هستیم باید یک گام به سمت خانه برداریم تا فاصله کمتر شده و مسئله قبلی به یک مسئله مشابه کوچکتر تبدیل شود. بخش سوم نیز همان بازگشت به خانه با مقدار کوچکتر و جدید خواهد بود.
الگوریتم تقسیم و غلبه
این الگوریتم دارای یک روش بالا به پایین است که در آن یک مسئله بزرگ به چند زیر مسئله کوچکتر تقسیم میشوند. پس از حل این زیرمسئلهها و ترکیب شدن با یکدیگر، به پاسخ مسئله بزرگ خواهید رسید. معمولا این مسئله بزرگ به چند الگوریتم بازگشتی تقسیم میشود.
الگوریتم برنامهریزی پویا
چنین الگوریتمهای معمولا برای حل مسائل بهیه سازی به کار میرود که در آنها یک دنباله از چند انتخاب صورت گرفته تا به جواب برسند. در واقع این الگوریتم برخلاف الگوریتم تقسیم و غلبه، رویکردی پایین به بالا دارد و از پیچیدگی بیشتری برخوردار است. همچنین عملکرد بسیار بهتری داشته و دارای قابلیت ذخیرهسازی حل زیرمسئلهها را دارد. این کار کمک میکند تا در صورت مواجه شدن با موارد مشابه، دیگر نیازی به حل مجدد نباشد. معمولا از این الگوریتم در مواقعی استفاده میشود که زیر مسئلهها دارای نوعی وابستگی با یکدیگر باشند.
الگوریتم حریصانه
این الگوریتم در بهینهسازی حل مسائل کاربرد دارد. به عبارتی دیگر، این الگوریتم با استفاده از تابع Selection Cheek از میان مجموع ورودیها، بهترین انتخاب را انجام میدهد. سپس با استفاده از تابع Feasibility cheek مشخص میشود که آیا استفاده از این انتخاب ممکن خواهد بود یا خیر. در نهایت این موضوع بررسی میشود که آیا انتخاب صورت گرفته منجر به حل مسائل خواهد شد؟ این تابع تا زمانیکه به جواب برسید یا انتخابی وجود نداشته باشد، به کار خود ادامه خواهد داد.
الگوریتم بروت فورس
این الگوریتم به بررسی تمام راهحلهای احتمالی میپردارد تا در نهایت بهینهترین پاسخ را پیدا کند. منظور از بهینهترین پاسخ در الگوریتم بروت فورس، پاسخی است که بتواند شرط مسئله را برآورده کند. به همین دلیل این الگوریتم بیشتر در مسائل کوچک مورد استفاده قرار میگیرد. شاید بهترین مثال برای این الگوریتم، رمزگشایی باشد که با بررسی تمام احتمالات و کلیدها، بهدنبال جواب میگردد. همچنین از الگوریتم بروت فورس در دادهکاوی نیز استفاده میشود.
الگوریتم عقب گرد
الگوریتم عقب گرد یا Backtrack یکی از الگوریتمهای حل مسائل است که تمام راهحلهای ممکن را سنجیده و در صورت ناکارآمدی آن، به عقب بازگشته و با اصلاح خود، راههای جدیدی را تست میکند. از این الگوریتم زمانی استفاده میشود که قصد داریم اولین جواب احتمالی را پیدا کنیم یا بهدنبال تمامی پاسخهای احتمالی هستیم. حل جدول سودوکو میتواند مثال مناسبی برای این الگوریتم باشد.
همانطور که در ابتدای این مقاله نیز اشاره کردیم، آشنایی با نحوهی نوشتن الگوریتمها، شما را یک گام جلوتر از سایرین نگه میدارد، پس اگر علاقهمندید بیشتر با مفاهیم مهم برنامهنویسی و سایر آموزشهای فناوری اطلاعات و کسبوکار آشنا شوید، همین حالا سری به وبسایت همیار آیتی بزنید، اگر دانشجوی رشتهی آیتی یا کامپیوتر هستید یا به هر شکلی به فناوری اطلاعات علاقهمندید، این وبسایت جای خوبی برای افزایش دانش شما است.