بشر در طول زندگی خود با مشکلات بسیاری مواجه میشود که ممکن است بسیاری از آنها بارها تکرار شوند. برای حل کردن مشکلاتی که چندین بار با آنها مواجه شدهایم، ثبت و دستهبندی راه حلهای مشخص کمک میکند که بتوانیم سریعتر و مطمئنتر با مسائل تکراری برخورد کنیم. ما به این راه حلهای تست شده و مطمئن، الگوریتم میگوییم. در این مطلب یاد میگیریم که الگوریتم چیست و در برنامه نویسی چه مفهومی دارد و با انواع آن آشنا میشویم.
معنی و تعریف الگوریتم چیست؟
ما اغلب برای حل مشکلات به دنبال سادهترین و سریعترین راهحلها هستیم. سالها است که علم با یافتن پاسخ سؤالات خود و استفاده از آنها در پیشامدهایی که الگوی تکراری دارند، اهداف خود را پیش میبرد و سریعتر از انتظار ما رازهای طبیعت را از دل آن بیرون میکشد. راهحلهایی که تست شده و مطمئن هستند و میتوانند سوالاتی با مفاهیم یکسان را حل کنند، الگوریتم نامیده میشوند. اگر بخواهیم معنی الگوریتم را در زمینه علوم کامپیوتر بررسی کنیم، میتوان گفت الگوریتمها مجموعه فرایندهایی هستند که به کمک آنها میتوان بسیاری از مسائل برنامهنویسی را بهراحتی حل کرد. به عنوان مثال الگوریتم یک موتور جستجو را در نظر بگیرید. الگوریتم موتور جستجو گوگل بهطور ساده اینگونه است که عبارت تایپ شده شما را دریافت کرده، آن را در پایگاه دادههای خود جستجو میکند و سپس صفحات وب مربوطه را پیداکرده و به شما نشان میدهد. این روند کلی از ایجاد سؤال تا رسیدن به پاسخ یک الگوریتم محسوب میشود. استفاده از الگوریتمها در کاهش هزینههای مالی و زمانی یک پروژه اهمیت زیادی دارد. الگوریتمها با انجام سلسله اقدامات مشخصی و در ازای گرفتن ورودی تعریف شده، نتیجهای مطابق انتظار به ما خواهند داد.
الگوریتم در ریاضی
جالب است بدانید که ریشه کلمه الگوریتم از نام خوارزمی دانشمند ایرانی به دست آمده است. خوارزمی در قرن دوم هجري شمسي در دوره مامون عباسي زندگی میکرد. از آنجایی که زبان آن دوره عربي بود از اين رو خوارزمي را به صورت الخوارزمي صدا ميزدند. روش دانشمند ايراني؛ در عمليات جمع و تفريق، ضرب و تقسيم مورد توجه دانشمندان رياضي اروپا قرار گرفت و خوارزمي در محاسبات چهار عمل اصلي و حل انواع مسايل رياضي روش مرحله به مرحله و دقيقي ارائه داده بود و در نهايت به جواب منجر ميشد. به همين خاطر از آن به بعد، هر روشي را که حل مسايل را به صورت مرحله به مرحله و دقيق و با جزئيات کافي بيان کند و در پايان به جواب برسد روش الگوريتمي ناميدند. کلمه الگوریتم از تلفظ لاتيني الخوارزمي به صورت Algorism يا الگوريتمي Algorithmic به دست آمده است.
کاربرد الگوریتم چیست ؟
تا به اینجا در این مقاله به صورت کامل به این پرسش پرداختیم که الگوریتم چیست، در این قسمت میخواهیم بگوییم الگوریتم چه کاربردی دارد؟ در زیر به برخی از کاربردهای الگوریتمها اشاره میکنیم:
ساده سازی و نظم دهی: یکی از مهمترین کاربردهای الگوریتمها ساده سازی و نظم دهی به فرمانهایی است که ما قرار است به کامپیوتر بدهیم و برنامه نویسی کنیم.
سرعت در پیاده سازی: الگوریتمها چون از قبل فرایند تولیدشان مشخص است بنابرین سرعت پیاده سازی آنها بسیار بالا است.
فهم بهتر از کد نویسی: ما الگوریتمها را ایجاد میکنیم تا بهتر بتوانیم کدنویسی را فهم کنیم.
معیارهای الگوریتم
تمامی الگوریتمها در هنگام طراحی باید معیارهای زیر را رعایت کنند تا بتوانند به جواب درستی برسند:
ورودی: مقادیر زیادی به عنوان ورودی وجود دارد که باید به صورت دقیق تعیین شوند.
باید حداقل یک مقدار تولید میشود.
قطعیت: هر دستورالعمل الگوریتم باید واضح و بدون ابهام باشد.
متناهی بودن: فرآیند باید پس از تعداد محدودی از مراحل خاتمه یابد.
اثربخشی: هر دستوری باید به اندازه کافی مهم باشد که در حین یافتن حل مشکل به صورت تئوری یا با استفاده از کاغذ و مداد ذکر شود.
ویژگیهای الگوریتم
صرفاً نوشتن توالی دستورالعملها به عنوان یک الگوریتم برای انجام یک کار خاص کافی نیست. داشتن ویژگیهای زیر در ارتباط با یک الگوریتم ضروری است:
عدم ابهام: هر مرحله در یک الگوریتم باید بدون ابهام باشد. یعنی هر دستورالعمل باید واضح و دقیق باشد. دستورالعمل در هیچ الگوریتمی نباید معنای متناقضی را نشان دهد. این ویژگی نشان دهنده معیار اثربخشی الگوریتم است.
محدوده ورودی: محدوده ورودی باید مشخص شود. این به این دلیل است که معمولا اغلب الگوریتمها ورودی محور است و اگر محدوده ورودی مشخص نشده باشد، این خطر وجود دارد که الگوریتم در یک حلقه بینهایت قرار بگیرد.
تعدد: الگوریتمها را میتوان به چندین روش مختلف نشان داد. یعنی میتوانید دنباله دستورات را به انگلیسی ساده یا به شکل شبه کد بنویسید. همچنین برای حل یک مسئله میتوانید چندین الگوریتم مختلف بنویسید.
سرعت: هر الگوریتمی با استفاده از برخی ایدههای از قبل مشخص شده نوشته شده است. در هنگام طراحی باید این نکته را در نظر گرفت که الگوریتم کارآمد باشد و خروجی را با سرعت بالا تولید کند.
تناهی: الگوریتم باید محدود باشد. یعنی پس از انجام عملیات مورد نیاز باید خاتمه داده شود.
ساختار منطقی الگوریتمها چیست؟
الگوریتمها با توجه به ساختار منطقی که دارند در 3 دسته جا میگیرند:
دنباله ای (Sequence): ساختاری مرحله به مرحله، که ترتیب گامها برای رسیدن به پاسخ در آن مشحص است.
شاخه ای(Branching): این الگوریتمها طبق قانون اگر-آنگاه در ریاضیات کار میکنند. به این صورت که پس از تعیین شرط، پاسخ با توجه به نتیجه شرط تعیین میشود.
حلقه ای (Loop): الگوریتمهای حلقه ای یا تکراری، در تعداد دفعات مشخصی شرطی را در پروژه اعمال میکنند و پس از تمام شدن فرایند، برنامه را پایان میدهند.
انواع الگوریتمها از نظر نوع مسئله
الگوریتمها دارای نقش مهمی در برنامهنویسی و حل مسئله هستند و از لحاظ کارایی و با توجه به نوع مسئله انواع مختلفی دارند که ما در این بخش به بررسی تعدادی از آنها میپردازیم.
الگوریتم بازگشتی (Recursive)
الگوریتمهای بازگشتی حالت پایه یا به اصطلاح base case مسئله را حل کرده و سپس با استفاده از این جواب، به حل مسائل تودرتو میپردازند. درواقع مسئله به چند بخش کوچک شکسته میشود که با استفاده از پاسخ مرحله قبل، مسئله بعدی قابلحل است. یکی از معروفترین مسائل بازگشتی، تابع فاکتوریل (factorial) است. در کد زیر عبارت If x is 0 حالت پایه محسوب میشود:
Fact(x)
If x is 0
return 1
return (x*Fact(x-1))
الگوریتم دینامیک (Dynamic)
از الگوریتمهای پویا یا دینامیک میتوان برای محاسبه بخشی از برنامه و استفاده از پاسخ آن، در مسائل آینده استفاده کرد. یعنی از پاسخهای یک بخش، میتوانید برای حل مسائل دیگر نیز بهره برد. دنباله فیبوناچی از الگوریتمهای دینامیک استفاده میکند:
Fib(n)
if n=0
return 0
else
prev_Fib=0,curr_Fib=1
repeat n-1 times /*if n=0 it will skip*/
next_Fib=prev_Fib+curr_Fib
prev_Fib=curr_Fib
curr_Fib=new_Fib
return curr_Fib
الگوریتم برگشت به عقب (Backtracking)
الگوریتم عقبگرد به دنبال پیدا کردن سرنخهای امیدبخشی است تا بهینهترین جواب را پیدا کند. این شیوه برای حل مسائل درخت فضای آن مسئله را ایجاد کرده و تعیین میکند کدام گره امیدبخش است. الگوریتمهای عقبگرد از علامتهایی برای بیان اینکه یک راهحل کاندید به حل مسئله نمیانجامد استفاده میکنند. مثلاً در ساخت درخت فضای حالت یک سؤال، اگر شاخهای از درخت جواب بهینهای در پی نداشته باشد، علامتگذاری میشود تا در عمق زیاد بررسی نشود و به جای آن، شاخه امیدبخشتر بررسی میشود. البته شاخه اول بهطورکلی هرس نمیشود بلکه موقتاً کنار گذاشته میشود تا در صورت پیدا نکردن بهینهترین جواب در شاخه دیگر، مجدداً به آن بازگردیم.
الگوریتم تقسیم و حل (Divide and conquer )
الگوریتمهای تقسیم و حل ابتدا مسئله را با توجه به نوع آن، چند بخش کوچکتر تقسیم کرده و به حل آنها میپردازند. سپس از ترکیب پاسخ بخشهای کوچکتر، پاسخ کلی مسئله بهدست میآید. برخی از روشهای مرتبسازی مانند مرتبسازی ادغامی (Merge Sort) و مرتبسازی سریع (Quick Sort) نیز از این دسته الگوریتمها محسوب میشوند. بهعنوان مثال مرتبسازی ادغامی ابتدا آرایهای از مقادیر ورودی را دو قسمت کرده و بهصورت بازگشتی، دوباره هر قسمت را دو قسمت میکند. این روند آنقدر ادامه پیدا میکند تا اعداد در دستههای کوچکتر صعودی یا نزولی مرتب شوند. سپس از ادغام زیر بخش های کوچک، آرایه مرتبشدهی بخشهای بزرگتر به دست میآید.
الگوریتم حریصانه (Greedy)
الگوریتمهای حریصانه به دنبال جستجوی بهینهترین پاسخ ممکن هستند اما لزوماً در هر مسئلهای، نمیتوانند بهینهترین پاسخ را پیدا کنند اما یکی از جوابهای بهینه را به شما معرفی خواهند کرد. البته برخی مسائل هم بهطورکلی پاسخ بهینه ندارند که به آنها مسائل NP complete میگویند. در شیوه حریصانه در هر مرحله عنصری که بر مبنای معیارها بهترین به نظر میرسد، بدون توجه به انتخابهایی که قبلاً انجام شده یا در آینده انجام خواهد شد، انتخاب میشود. مسئله خرد کردن سکهها یکی از مثالهای معروف در بهکارگیری الگوریتم حریصانه است. این مسئله میگوید فرض کنید که شما باید مبلغی مثلاً 36 تومان را با سکههای 20 تومانی، 10 تومانی، 5 تومانی و 1 تومانی پرداخت کنید به طوری که کمترین تعداد سکه را بپردازید. کمترین تعدادی که بتوان با آن 36 تومان را پرداخت کرد پاسخی بهینه برای مسئله ما خواهد بود که در اینجا، برداشتن یک سکه از هر 4 مدل است.
الگوریتم بروت فورس (Brute force)
الگوریتم جستجوی جامع یا بروت فورس تمامی راهحلهای احتمالی را بررسی میکند تا بتواند بهینهترین پاسخ را پیدا کند. در این الگوریتم بهینهترین پاسخ با ویژگی "ارضا کردن شرط مسئله" سنجیده میشود و به همین دلیل بیشتر برای مسائل کوچک کاربرد دارد. این الگوریتم در رمزگشایی نیز کاربرد زیادی دارد و عملکرد آن بهگونهای است که تمامی کلیدها را چک میکند تا به جواب برسد. دادهکاوی نیز زمینه دیگری برای استفاده از این نوع الگوریتمها است.
فلوچارت الگوریتم
فلوچارت یا روندنما، نموداری است که یک فرآیند، یک سیستم یا یک الگوریتم کامپیوتری را به صورت تصویری نشان میدهد. این نمایش نموداری یکی از راه حل مسئله است و تجزیه و تحلیل مراحل ضروری برای حل مسئله را ارائه میدهد. این مفهوم برای اولین بار در سال 1921 به عنوان نمودار فرآیند جریان برای اعضای انجمن مهندسین مکانیک آمریکا معرفی شد و در محاسبات اولیه در دهه 50 بسیار محبوبیت گردید. به یاد داشته باشید که فلوچارت فقط توضیح میدهد که در هر مرحله چه اتفاقی باید بیفتد، چه ورودی لازم است و خروجی آن مرحله چیست، اما چیزی در مورد نحوه اجرای مرحله نمیگوید. هنگامی که یک فلوچارت رسم میشود، به یافتن ویژگیهای کمتر آشکار فرآیند کمک میکند و سپس میتواند برای بهبود کارایی آن اصلاح شود، مانند نقص ها، مراحل غیر ضروری، نقاط خطاخیز و.... یک فلوچارت باید به عنوان یک نمودار تکامل یافته دیده شود.
چه زمانی از فلوچارت در الگوریتم باید استفاده کنیم؟
اگر تعداد دستورات زیاد شود ایجاد الگوریتم کار آسانی نخواهد بود و باعث ایجاد بینظمی و اشتباه خواهد شد، در چنین مواقعی باید طرح خود را در قالب فلوچارت یا روندنما ارائه کنید. فلوچارت علاوه بر این که روند کلی طرح را در قالب نمودار نمایش میدهد از اعتبار بیشتری نیز برخوردار است و همچنین امکان به وجود آمدن خطا را به حداقل میرساند. هنگام طراحی و برنامه ریزی یک فرآیند، فلوچارتها میتوانند به شما در شناسایی مراحل مهم کمک کنند و همزمان تصویر بزرگتری از آنچه را که در حال انجام است ارائه دهند. فلوچارت وظایف را به ترتیب زمانی سازماندهی میکند و آنها را بر اساس نوع عمل دسته بندی میکند، به عنوان مثال. فرآیند، تصمیم، داده و... .
معرفی بهترین کتابهای آموزش الگوریتم
اغلب متخصصان توصیه میکنند تا به صورت عملی و همراه با کدنویسی برنامه نویسی را یاد بگیرید و به سراغ کتاب خواندن نروید. اما برخلاف یادگیری یک زبان برنامه نویسی، برای مبحث الگوریتم و فلوچارت بهتر است با یک یا دو کتاب کاربردی کار را شروع کنید. الگوریتم و فلوچارت نیازمند تمرین بسیار است و مرور این کتابها باعث میشود تا با روشهای مختلف و درست حل مسائل از ساده تا پچیده آشنا شوید. در ادامه سعی کردیم کتابهای مفید و توصیه شده توسط جامعه برنامه نویسان را معرفی کنیم.
کتاب آشنایی با الگوریتم (Introduction to Algorithms)
این کتاب توسط نشر دانشگاه MIT معرفی شده است و برای آشنایی با ساختمان دادهها نیز میتواند به کار رود. پس از اضافه شدن نویسنده چهارم به جمع نویسندگان در ویراست دوم، این کتاب با نام مخفف CLRS شناخته شد. کتاب CLRS به عنوان مرجع اصلی برای دروس الگوریتم در بسیاری از دانشگاههای ایران و جهان استفاده میشود و یکی از رایجترین منابع برای الگوریتم در مقالات منتشر شده میباشد. کتاب مذکور نیم میلیون نسخه در طول ۲۰ سال اول خود فروش داشته است.
کتاب برنامهنویسی به زبان ++C
کتاب برنامه نویسی به زبان سی پلاس پلاس یکی از اولین کتبی است که علاقه مندان و دانشجویان درس مبانی کامپیوتر و برنامه نویسی به آن مراجعه میکنند. نویسنده این کتاب معروف، آقای جعفرنژاد قمی است. حتی ممکن است شما هم در هنگام جستجو در سایتها و کتابهای آموزشی زبانهای برنامهنویسی به این نام برخورده باشید.
کتاب Clean Code
Clean Code کتابی است که در آن رابرت مارتین مبحثی کاملا نو و انقلابی را در رابطه با کدنویسی ارائه کرده است. این کتاب نکات مورد نیاز برای مسلط شدن بر برنامه نویسی را در اختیار مخاطب قرار میدهد و از سه بخش تشکیل شده است:
بخش اول به اصول، نمونهها و روشهای مختلف توسعه نرمافزار اشاره دارد.
بخش دوم به مطالعات موردی مختلف در رابطه با پیچیدگی در دنیای کدنویسی اختصاص داده شده است.
بخش سوم هم شامل لیستی از نکات و مواردی است که در فرایند انجام مطالعات، استخراج و جمعآوری شدهاند.
کتاب آشنایی با الگوریتم با رویکرد خلاقانه (Introduction to Algorithms: A Creative Approach)
کتاب آشنایی با الگوریتم با رویکرد خلاقانه یکی از منابع اصلی المپیادهای کامپیوتر و مسابقات برنامهنویسی برای یادگیری طراحی و تحلیل الگوریتمها است. این کتاب با بررسی و آموزش فرایند توسعه الگوریتمها، بر جنبههای خلاقانه طراحی الگوریتم تأکید دارد و شامل صدها حل مسئله و مثال است که برای بهبود تواناییهای حل مسئله و درک اصول طراحی الگوریتم طراحی شده است. در این کتاب علاوه بر معرفی تکنیکهای مختلف طراحی الگوریتمها و روشهای حل برخی مسائل الگوریتمی، روشهای تحلیل و حل آنها با جزئیات بیشتر و بهصورت گامبهگام بررسی شده است.
کتاب Code Complete
این کتاب نوشته استیو مک کانل کتابی است که اولین بار در سال 1993 توسط ماکرروسافت پرس چاپ و منتشر شد. نکته قابل توجه این کتاب این است که مهم نیست چقدر تجربه کدنویسی داشته، به چه زبانی کد میزنید و یا ابعاد پروژه شما چقدر است. این کتاب به خواننده آگاهی داده و او را به فکر کردن و ایدهپردازی ترغیب میکند.
جمع بندی
الگوریتمهای کاربردی زیادی در ریاضیات و علوم کامپیوتر وجود دارند که ما بهطور خلاصه به معرفی تعدادی از آنها پرداختیم. تسلط بر الگوریتمها اهمیت زیادی برای برنامه نویسان و بهویژه در بخش بک اند (Back-End) وب سایت یا برنامهها دارد زیرا میتواند نقطه قوتی برای استخدام در شرکتهای برنامه نویسی باشد. فلوچارتها و الگوریتمها ازجمله پیشنیازهای یادگیری برنامهنویسی هستند.
۱۰ دیدگاه
بابک۲۶ آذر ۱۴۰۲، ۱۳:۵۸
درود
تازه میخوام برنامه نویسی رو شروع کنم. بهترین و کاملترین کتاب برای الگوریتم و فلوچارت چه کتابی است؟
نازنین کریمی مقدم۰۲ دی ۱۴۰۲، ۱۶:۵۱
درود
همونطور که در مقاله اشاره کردیم کتاب CLRS اصلیترین مرجع برای یادگیری الگوریتم هست.
۲۲ خرداد ۱۴۰۱، ۱۲:۴۴
عالی بود دمتون گرم
zahora۲۳ خرداد ۱۴۰۰، ۱۶:۴۹
سلام مطالب بسیار آموزنده بود تشکر
ghazaleh۲۸ مرداد ۱۳۹۹، ۰۷:۰۴
واقعا سایتتون خیلی خوبه من چند مورد را خواندم، خیلی لذت بردم .من همیشه اصولا مقالات و توضیحات زبالن اصلی میخونم ولی چند وقته به زبان فارسی هم جستجو میکنم که با سایت شما اشنا شدم .جای همچین سایت پارسی زبانی خیلی خالی بود.
امیدوارم همواره مانا باشید.
لقمان آوند۰۴ شهریور ۱۳۹۹، ۱۲:۱۸
ممنون از شما
از رضایتتون خوشحالیم و به ما انگیزه میده که باز بهتر باشیم
رضا۰۲ بهمن ۱۳۹۸، ۱۲:۰۳
لطفا اگر میشه در مورد الگوریتم بروت فورس توضیح بیشتری قرار بدید.
رضا۰۲ بهمن ۱۳۹۸، ۱۱:۵۴
من تفاوت بین الگوریتم بازگشتی و دینامیک رو نفهمیدم. در هردو حالت، با حل مسئله قبلی، مسئله بعدی حل میشه.
Ziba Darabi۱۱ آبان ۱۳۹۸، ۰۸:۲۹
بسیار سپاس از مطلب خوبتون واقعا استفاده کردم.
ریحانه یزدانی۱۱ آبان ۱۳۹۸، ۰۹:۳۷
سلام زیبا جان
مرسی از تو که وقت گذاشتی ;)
راهنمای مقاله
معنی و تعریف الگوریتم چیست؟
الگوریتم در ریاضی
کاربرد الگوریتم چیست ؟
معیارهای الگوریتم
ویژگیهای الگوریتم
ساختار منطقی الگوریتمها چیست؟
انواع الگوریتمها از نظر نوع مسئله
فلوچارت الگوریتم
چه زمانی از فلوچارت در الگوریتم باید استفاده کنیم؟
معرفی بهترین کتابهای آموزش الگوریتم
جمع بندی
راهنما و فهرست مقاله
معنی و تعریف الگوریتم چیست؟
الگوریتم در ریاضی
کاربرد الگوریتم چیست ؟
معیارهای الگوریتم
ویژگیهای الگوریتم
ساختار منطقی الگوریتمها چیست؟
انواع الگوریتمها از نظر نوع مسئله
فلوچارت الگوریتم
چه زمانی از فلوچارت در الگوریتم باید استفاده کنیم؟