الگوریتم برنامهنویسی چیست؟ بگذارید موضوع بحث امروزمان را با یک مثال شروع کنیم.
زمانی که یک معمار میخواهد پروژه ساخت یک خانه را شروع کند، ابتدا یک طرح یا نقشه و مراحل انجام کار را به صورت مرتب برای خود لیست میکند؛ در واقع یک الگو برای ساخت خانه ایجاد میکند.
یک برنامهنویس نیز وقتی قصد دارد یک برنامه یا یک تکه کد را بنویسد، یک الگو برای نوشتن خود دارد. اما اگر ایدهای نداشت که از کجا شروع کند، لازم نیست نگران باشد زیرا این دلیلی است که الگوریتمها و فلوچارتها بهوجود آمدهاند. به قول حرفهایها سریع دست به کد نشوید. واژه الگوریتم از یک ریاضیدان، ستارهشناس و جغرافیدان به نام خوارزمی گرفته شده است. اکنون میخواهیم به شما بگوییم الگوریتم برنامه نویسی چیست و چگونه از آنها باید استفاده کنید؟
در آخر نیز برای شما یک شگفتانه در نظر گرفتهایم. پس تا پایان این مقاله همراه ما باشید.
الگوریتم برنامه نویسی چیست؟
برای اینکه معنی و مفهوم الگوریتم در خاطر شما بماند از واژه اُلگوریتم استفاده میکنم اگر چه غلط است. اُلگوریتم یعنی پیادهسازی یک مسئله. ما یک الگو میسازیم تا به کمک آن مسئلهای را حل کنیم درست مانند معمار. پس یک برنامهنویس باید توانایی طراحی الگوریتم را داشته باشد که خیلی هم ساده است. حالا چجوری؟ یعنی به مسئله، به صورت مرحله مرحله فکر کردن و آن را به مراحل کوچکتر تقسیم کردن و در نهایت به صورت دستوری به کامپوتر دستور دادن. به همین سادگی!
به مثال توجه کنید:
فرض کنید قرار است برنامهای بنویسید که دو عدد را جمع و حاصل را چاپ کند. حالا میخواهیم برای این مسئله یک الگو پیادهسازی کنیم.
اولین مرحله در الگوریتم فکر کردن به مسئله به صورت مرحلهای است؛ یعنی گرفتن دو عدد برای جمع و چاپ آن. حالا باید آن را به مسئلههای کوچکتر تقسیم کنیم که میشود:
-
اولین عدد را بگیر
-
دومین عدد هم بگیر
-
دو عدد را باهم جمع کن و در حافظه نگه دار
-
حالا جواب را چاپ کن
ساختار منطقهای الگوریتمها:
-
دنبالهای: در این ساختار ترتیب گام تا رسیدن به پاسخ، در آن مشخص است یعنی ساختاری مرحله به مرحله.
-
شاخهای: این ساختار طبق قانون "اگر-آنگاه" عمل میکند یعنی پاسخ با توجه به نتیجه شرط مشخص میشود؛ برای مثال زوج و فرد بودن عدد.
-
حلقهای: این ساختار الگوریتم با توجه به تعداد مشخصی از شرط نتیجه مشخص میشود و پس از تمام شدن شرط، برنامه پایان مییابد یعنی ساختار تکراری.
مشخص کردن 3 عامل اصلی در نوشتن یک الگوریتم:
برای نوشتن یک الگوریتم 3 عامل را باید در مسئله مشخص کنیم:
-
اطلاعاتی که در اختیار ما قرار دارد و باید به کمک آن به حل مسئله بپردازیم؛ یعنی دادههای معلوم مسئله.
-
نتیجهای که بر اثر انجام محاسبات روی داده به دست میآوریم؛ یعنی خواستههای مسئله.
-
مجموعه دستورات و روابطی که برای رسیدن به خواسته مسئله روی دادهها و مقادیر مجهول انجام میدهیم؛ یعنی عملیات محاسباتی.
نوشتن یک الگوریتم برنامهنویسی چه شرایطی دارد؟
بعد از اینکه 3 عامل را مشخص کردیم حالا باید بدانیم برای نوشتن یک الگوریتم چه شرایطی لازم است؟
-
داشتن نقطه شروع و پایان مشخص
-
داشتن ورودی (یا هیچ ورودی یا چند ورودی)
-
داشتن خروجی (یک یا چند خروجی)
-
داشتن کارایی و قطعیت (با زبانی دقیق و بیابهام بیان شود یعنی قابل اجرا باشد)
-
داشتن محدودیت (در یک بازه زمانی کوتاه و معقول پس از طی مراحل محدود پایان یابد)
چرخه عمر یک الگوریتم برنامهنویسی چیست:
-
طراحی: روشهای مختلفی برای آن وجود دارد.
-
اثبات درستی: باید مشخص شود الگوریتم درست است یا خیر؛ یعنی به ازای ورودی مناسب یک خروجی صحیح بدهد.
-
تحلیل: یعنی یک الگوریتم به چه میزان پیچیدگی زمانی و فضایی دارد.
-
پیادهسازی: نوشتن با یک زبان برنامهنویسی معین
-
تست برنامه: این مورد شامل 2 مرحله است: اشکالزدایی و اندازهگیری کارایی
مهمترین انواع الگوریتمها از نظر نوع مسئله کدام است؟
-
الگوریتم های بازگشتی
در این نوع، اجرای برخی از دستورات الگوریتم باعث فراخوانی همان الگوریتم میشود. روش کار الگوریتم بازگشتی به شیوه زیر است:
-
قسمت اول حالت پایه است که در آن دیگر صدا زدن تابع به صورت بازگشتی رخ نمیدهد و مقدار تابع را از ابتدا میدانیم.
-
قسمت دوم شامل پیادهسازی اعمالی است که به کمک آنها مسأله کوچکتر شده و تابع را با مقادیر جدید صدا میزنیم.
-
قسمت سوم بخشی از تابع است که در آن خود تابع را با مقادیر جدید صدا میزنیم.
برای درک بهتر این موضوع، یم مثال از دنیای واقعی میزنیم. فرض کنید، میخواهیم الگوریتمی برای رسیدن به منزل ارائه دهیم:
قسمت پایه این الگوریتم را بدین صورت بیان میکنیم که، اگر در خانه هستیم کاری انجام نمیدهیم. قسمت دوم این الگوریتم شامل شکستن مسأله است. این کار را به این صورت انجام میگیرد که یک قدم به سمت خانه حرکت میکنیم. در این صورت فاصله ما با خانه کم شده و مسأله به یک مسألهی مشابه با اندازه کوچکتر تبدیل میشود. بخش سوم هم صدا زدن تابع بازگشت به خانه با مقدار کوچکتر و جدید است.
-
الگوریتمهای تقسیم و غلبه
روش این الگوریتم یک روش بالا به پایین است که حل یک مسئله با تقسیم آن به زیر مسئلههای کوچکتر و با حل زیر مسئلههای کوچکتر و ترکیبشان، جواب مسئله بزرگتر را به دست میآوریم که اصولا این روش به یک الگوریتم بازگشتی تقسیم میشود.
-
الگوریتمهای برنامه ریزی پویا
این الگوریتم اصولا برای حل مسائل بهینهسازی که در آنها یک دنباله از انتخابها صورت میگیرد تا جواب بهینه حاصل گردد، استفاده می شود. این روش در مقایسه روش تقسیم و غلبه، یک روش پایین به بالا میباشد.
الگوریتم برنامهریزی پویا در مقایسه با روش تقسیم، کمی پیچیدهتر است اما بهتر کار میکند و برخلاف روش تقسیم و غلبه حل زیر مسئلهها در یک جدول ذخیره میشود تا در صورت برخورد دوباره با آنها، دیگر نیازی به حل مجدد نداشته باشیم و از آن جوابها استفاده کنیم.
این روش برای حل مسائلی که در آنها زیر مسئلهها به هم وابستهاند، عملکرد خوبی دارد. دنباله فیبوناچی یکی از الگوریتمهای دینامیک است.
-
الگوریتمهای حریصانه
این روش برای بهینهسازی یا حل مسئله به کار میرود؛ یعنی هر دفعه با استفاده از یک معیار حریصانه بین مجموع ورودی، بهترین را انتخاب میکند که به آن تابع selection cheek میگویند. در ادامه، انتخاب میکنیم که آیا انتخاب جاری امکانپذیر است یا خیر که این عمل توسط feasibility cheek صورت میگیرد. در نهایت باید بررسی کنیم آیا اضافه کردن انتخاب جاری منجر به حل مسئله میشود یا خیر؟
در صورت نیاز کارها ادامه می یابد و تابع حل شدن تا زمانی که به جواب رسیده باشیم یا انتخابی برای بررسی نباشد، صورت میگیرد. یکی از مثالهای معروف در این الگوریتم، مسئله "پول خرد" است که هدف یافتن کمترین پول خرد ممکن جهت بازگرداندن مبلغ است.
بیشتر بخوانید: برای درک بیشتر از برنامه نویسی حتما تعریف برنامه نویسی را مطالعه کنید.
-
الگوریتم «عقب گرد»
در این روش، از پیمایش عمقی پیشوندی به منظور جست و جوی درخت فضای حالت استفاده میشود. این الگوریتم برای حل مسئلهای است که در آن مجموعهای از محدودیتها و یک تابع هدف وجود دارد و هدف، یافتن حل بهینه مسئله است.
-
الگوریتم های بروت فروس
این الگوریتم تمامی راه حلهای احتمالی را بررسی میکند تا بتواند بهینه ترین پاسخ را پیدا کند. در الگوریتم بروت فروس بهینه ترین پاسخ با ویژگی "برآورده کردن شرط مسئله" سنجیده میشود؛ به همین دلیل بیشتر برای مسائل کوچک کاربرد دارد.
بهترین مثال برای استفاده از این الگوریتم، در رمزگشایی است و عملکرد آن بهگونهای است که تمامی کلیدها را چک میکند تا به جواب برسد. زمینه دیگر استفاده از این نوع الگوریتمها داده کاوی میباشد.
پرکاربردترین الگوریتمهای مورد استفاده:
-
جست و جوی دودویی
این الگوریتم جزء الگوریتمهای تقسیم و غلبه حساب میشود و نحوه کار آن به این صورت است که ابتدا باید یک لیست از قبل آماده شده باشد، سپس کلید مورد نظر را با عنصر میانی لیست مقایسه می کنیم؛ اگر برابر بود عنصر میانی را بر می گردانیم اگر برابر نبود 2 حالت ممکن است رخ دهد یا کلید کوچکتر از عنصر میانی است که در این صورت باید سمت چپ لیست را جست و جو کنیم یا بزرگتر از عنصر میانی که در این صورت باید لیست سمت راست را جست و جو کنیم.
-
مرتبسازی ادغامی
در مرتبسازی ادغامی لیست را به 2 قسمت تقسیم میکنیم؛ سپس هر دو قسمت را به صورت بازگشتی مرتب نموده و نتایج آن 2 را باهم ادغام میکنیم. توجه کنید که این عمل را تا زمانی که لیستها به طول 1 ایجاد شود، انجام میدهیم.
-
مرتبسازی سریع
این الگوریتم نیز در طبقهبندی الگوریتم تقسیم و غلبه قرار دارد. در مرتبسازی سریع ابتدا یک عنصر برای مقایسه به نام عنصر افراز در نظر میگیریم و باتوجه به این عنصر، لیست را به 2 قسمت تقسیم میکنیم:
-
عناصر کوچکتر از عنصر افراز
-
عناصر بزرگتر از عنصر افراز
سپس هر کدام از 2 لیست را به صورت بازگشتی مرتب میکنیم.
-
کروسکال
الگوریتم کروسکال یکی از الگوریتمهای حریصانه است که برای بهدست آوردن درخت پوشای کمینه استفاده میشود. این الگوریتم برای شروع با مجموعه تهی E’، کار را شروع میکند سپس در هر یال با کوچکترین وزن از مجموعه E-E’ انتخاب میشود و در صورتی که افزودن آن به مجموعه E’ باعث به وجود آمدن هیچ دُوری نشود، آن یال به E’ اضافه شده در غیر این صورت، آن یال از E حذف میشود و یال مورد نظر به E’ اضافه نمیشود. در نهایت این کار تاجایی ادامه مییابد که رابطه |E’|=n-1 برقرار شود.
کلام آخر:
حالا میدانیم الگوریتم برنامه نویسی چیست و پرکاربردترین آنها کدام هستند. فلوچارتها و الگوریتمها از جمله پیشنیازهای یادگیری برنامهنویسی هستند. الگوریتمهای کاربردی زیادی وجود دارند که ما به طور خلاصه به معرفی تعدادی از آنها پرداختیم. تسلط بر الگوریتمها برای برنامهنویسان و به ویژه بخش بک-اند کارها اهمیت زیادی دارد چرا که میتواند نقطه قوتی برای استخدام در شرکتهای معتبر باشد.
راستی نکته دیگری که برای نوشتن الگوریتمها باید خدمتتان عرض کنیم این است که مراحل را به ترتیب و پشت سرهم بنویسید که قرار است چه کارهایی انجام شود. یعنی فکر کنید که کامپیوتر یک بچه است که باید کوچکترین چیزها را برایش توضیح دهید و هنگام استفاده از عملگرهای ریاضی حق تقدم آنها را رعایت کنید.
امیدواریم که مطلب مورد پسندتان قرار گرفته باشد و نظرات خود را حتما با ما به اشتراک بگذارید و اگر شما هم الگوریتم دیگری میشناسید در قسمت کامنتها برای ما بنویسید.
حالا نوبت میرسد به شگفتانهای که برای شما عزیزان درنظر گرفتیم؛ آن هم چیزی نیست جز دوره آموزش الگوریتم و حل مسئله سایت درسمن که به صورت رایگان در اختیار شما قرار گرفته است.
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.