انسان از روزی که در کره زمین مشغول به فعالیت شد، با قوانین و ساختار الگوریتم آشنا بود. هر آدمی در طی روز بیشترین زمان خود را صرف بررسی الگوریتمهای متفاوت میکند. یعنی یک صورتمسئله ایجاد میکند و به دنبال راه حلی برای پاسخ به آن است. حال، هرچه سرعت دسترسی به پاسخ این صورت مسئله سریعتر باشد، یعنی الگوریتم انتخابی مناسبتر و ایدهآل است.
[su_expand more_text=" برای مشاهده ادامه این متن کلیک کنید" less_text="مخفی کردن متن" link_style="dashed" link_align="center" more_icon="icon: chevron-down"]
فرض کنید قصد دارید ناهار امروز را در یکی از رستورانهای شهر خود، بگذرانید. برای این کار اولین صورت مسئله، انتخاب رستوران مناسب است. برای این سؤال قطعاً یک پاسخ وجود دارد. حال برای رسیدن به این رستوران باید صورتمسئله بعدی را مطرح کنید:
«چطور و از کدام مسیر به رستوران بروم تا سریعتر برسم و در ترافیک نباشم؟»
همینطور که ملاحظه میکنید، این سؤال با صورتمسئله قبلی در ارتباط است و این یعنی الگوریتم شما در حال توسعه میباشد. بهترین مسیر انتخابی شما برای دسترسی به رستوران موردنظر، همان بهترین الگوریتم برای حل مسئله است. به همین سادگی یکی از الگوریتمهای موجود در ذهن شما را پیادهسازی کردیم.
بگذارید مفهوم الگوریتم را با یک مثال دیگر جا بیندازیم:
فرض کنید میخواهید در خانه، یک پیتزای خوشمزه درست کنید و همه مواد اولیه را هم در منزل دارید. بدیهی است که باید یک سری مراحل را طبق دستور طی کنید تا به پیتزا برسید.
گاه الگوریتم شما دارای مراحلی است که تکرار میشوند. مثلا شاید لازم باشد چندبار به محفظه فر نگاه بندازید تا ببینید پیتزای شما پخته است یا خیر؟ شاید هم در مراحلی نیاز به تصمیمگیری داشته باشید: اگر پیتزا پخته است، آن را از فر خارج میکنم!
اگر الگوریتم شما مناسب نباشد، به نتیجه موردنظرتان نمیرسید. به عنوان مثال اگر پیتزا را با مواد اولیه قرمهسبزی درست کنیم، نتیجه کار ما پیتزا نخواهد شد!
تا اینجا تا حدودی با مباحث مربوط به الگوریتم آشنا شدید. اجازه بدهید تا به صورت تخصصیتر و در حوزه علوم کامپیوتر به این موضوع بپردازیم:
الگوریتم چیست؟
به نقل و بازگردانی از ویکیپدیا:
در علوم کامپیوتر و ریاضیات، الگوریتم به یک سری از دستورالعملها با ساختار محدود و مشخص گفته میشود که برای حل یک صورت مسئله ارائه میگردد. روند اجرایی یک الگوریتم بدون ابهام بوده و خروجی آن کاملاً مشخص است. به طور کلی هر الگوریتم یک یا چند ورودی و خروجی قابل درک دارد.
الگوریتم در برنامهنویسی
در علوم کامپیوتر و برنامهنویسی، الگوریتمها معمولاً در قالب توابع پیادهسازی میشوند. در واقع این توابع هر یک به صورت بخشی کوچک و با وظایف مشخص ایجاد شده و در کنار یکدیگر، سیستم واحدی را تشکیل میدهند.
به عنوان مثال اگر شما در گوگل عبارت «آکادمی آنلاین روکسو» را جستجو کنید، گوگل با ارائه الگوریتمهای متفاوت به دنبال پاسخی برای درخواست شماست. قطعاً این سایت با استفاده از توابع هوشمند و از پیش تعریف شده، دقیقترین پاسخ را به شما میدهد.
در مثال دیگر به سراغ نرمافزار فتوشاپ میرویم. اگر با این نرمافزار کار کرده باشید، متوجه خواهید شد که دهها ابزار گوناگون برای کار روی تصاویر وجود دارند که هر یک با الگوریتم مشخصی کار میکنند. مثلا ابزار برش (Crop) با الگوریتم منحصر به فرد خود، تصویر را در ابعاد و اندازه دلخواه ما برش میزند یا ابزار قلمو (Brush) این اجازه را به ما میدهد تا روی تصاویر، اشکال دلخواه خود را ترسیم کنیم.
مثالهای متنوع دیگری را میتوان از ابزارها و تجهیزات هوشمند ارائه کرد که در حوصله این بحث نمیگنجد. بنابراین برنامهنویسان (Programmers) برای اجرای هر پروژه و نرمافزار، ابتدا الگوریتم مورد نیاز آن را ایجاد میکنند. این کار به آنها کمک میکند که علاوه بر صرفهجویی در زمان اجرا، خروجی دقیق و قابل قبولی را ارائه کنند. البته این بدین معنی نیست که تمام الگوریتمهای مطرح شده، در همان ابتدا دقیق و کاربردی هستند، چون الگوریتمها در آینده و به مرور زمان بهینهسازی شده و خطاهای آنها برطرف میشود.
وقتی از آموزش الگوریتم در برنامه نویسی صحبت به میان میآید در عمل میخواهیم یک ارتباط بین ذهن انسان و زبان ماشین (کامپیوتر) برقرار کنیم. الگوریتم در کامپیوتر یا بهتر است بگوییم الگوریتم در برنامه نویسی دقیقا مشابه الگوریتم پختن یک پیتزا است. همانطور که برای تهیه یک پیتزا نیاز به مواد اولیه است، در برنامه نویسی نیز برای تولید یک نرمافزار به ورودیهای مشخص احتیاج داریم. در واقع نرمافزارهای کامپیوتری به الگوریتمی که در پس پرده آنها نوشته شده است، دقت کرده و به ازای ورودی (عملکرد کاربر)، خروجی مشخصی را تولید میکنند. پس تا به اینجا متوجه شدیم که هر الگوریتم در برنامه نویسی سه مشخصه اصلی دارد:
- رویه یا روش (Procedure)
- ورودی (Inputs)
- خروجی (Outputs)
از لحظه روشن شدن یک کامپیوتر تا خاموش شدن آن، هزاران الگوریتم اجرا میشود. تمام کارهایی که در یک کامپیوتر انجام میدهید توسط یک زبان برنامه نویسی پیادهسازی شدهاند. هر یک از برنامههای موجود با استفاده از یک الگوریتم مشخص کار میکنند. پس الگوریتم در برنامه نویسی یک شرط لازم است. یعنی برنامهای که الگوریتم نداشته باشد کار نمیکند.
شما میتوانید به یک کامپیوتر بگویید که چه کاری را انجام دهد. البته دقت کنید که این بدین معنی نیست که هر الگوریتم برنامه نویسی به معنی کدنویسی آن است. بلکه با یک الگوریتم میخواهیم روند اجرای یک نرمافزار را قبل از کدنویسی تشریح و تحلیل کنیم. یعنی بررسی میکنیم که آیا ورودیهای مورد انتظار ما خروجی مورد نظر را تولید میکنند یا خیر؟ برای اینکار معمولا از اصطلاح سودوکد یا Pseudocode استفاده می کنند.
Pseudocode چیست؟ برای نمایش یک الگوریتم، متدها و روشهای متفاوت وجود دارد. یکی از این روشها سودوکد است. سودوکد نسخه ساده و قابل درک یک برنامه است که معمولا به زبان انگلیسی بیان میشود. سودوکدها بین الگوریتم و برنامه نویسی ارتباط قابل فهمی را برقرار میکنند. سودوکدها شامل هیچگونه سینتکس (Syntax) نیستند و فقط برای درک انسان ارائه میشوند. مثلا نمونه زیر شامل یک سودو کد است:
FUNCTION linearSearch(list, searchTerm):
FOR index FROM 0 -> length(list):
IF list[index] == searchTerm THEN
RETURN index
ENDIF
ENDLOOP
RETURN -1
END FUNCTION
مشخصههای یک الگوریتم خوب چیست؟
همانطور که در بالا اشاره کردیم، تمام الگوریتمها خوب نیستند و ممکن است خروجی مناسبی نداشته باشند. یک الگوریتم بد، نه تنها زمان توسعهدهنده و برنامهنویس را میگیرد، بلکه منجر به شکست پروژه میشود.
پس این سوال مطرح میشود که یک الگوریتم خوب چه ویژگیهایی دارد؟
واضح و بدون ابهام
یک الگوریتم باید بدون هیچگونه ابهامی ارائه شود. یعنی هر مرحله از آن باید بدون چالش باشد.
ورودی و خروجی تعریف شده
هر الگوریتم شامل یک سری ورودی و خروجی است. این ورودیها باید به صورت مشخص تعریف و در اختیار سیستم قرار داده شوند تا خروجی پیشبینیشده ما، بدون هیچگونه خطایی محاسبه و ارائه گردند.
محدود و متناهی
یک الگوریتم تحت هر شرایطی باید محدود و متناهی باشد. یعنی الگوریتمهایی که سر و ته ندارند به هیچ دردی نمیخورند!
قابل اجرا
یک الگوریتم باید به راحتی قابل اجرا باشد. یعنی شما نمیتوانید الگوریتمی را طراحی کنید که مثلا در سال ۲۰۵۰ از آن استفاده شود. الگوریتمها باید با توجه به شرایط حال حاضر و تکنولوژی های روز، مطرح و پیادهسازی شوند.
مستقل از زبان
هر الگوریتم باید با زبان مشخص پیادهسازی شود تا در هر زبانی قابل اجرا باشد. یعنی اگر یک الگوریتم به زبانهای مختلف برنامهنویسی شود باید خروجی یکسانی داشتهباشد.
فلوچارت (Flowchart) یا روند نما چیست؟
یکی دیگر از روشهای نمایش الگوریتم در برنامه نویسی، فلوچارت (Flowchart) یا روندنما است. فلوچارت یک نمایش گرافیکی از تصمیمها و نتایج الگوریتمها در قالب اشیاء هندسی است که در سال ۱۹۴۰ توسط آقایان Herman Goldstine و John von Neumann اختراع شد. فلوچارت قادر است به صورت مرحلهبهمرحله فرآیند اجرا و حل یک مسئله را به تصویر بکشد. در اکثر زبانهای برنامه نویسی برای نمایش روند اجرا (قبل از کدنویسی) از الگوریتم به همراه فلوچارت استفاده میشود. یکی از بهترین نرمافزارها برای ترسیم یک فلوچارت در ویندوز، نرمافزار Microsoft Visio است.
مثلا فرض کنید میخواهیم نرمافزار Chrome را در حالیکه به آنتیویروس متصل هستیم باز کرده و سپس به سایت google.com برویم. الگوریتم و فلوچارت این فرآیند به صورت زیر ترسیم می شود:
یک فلوچارت شامل عناصر هندسی متفاوتی مانند دایره، بیضی، مستطیل، لوزی، متوازیالاضلاع و ... است که هر یک بیانگر یک عمل هستند. در مثال فوق شروع یک برنامه را با استفاده از بیضی نمایش دادهایم. سپس از لوزی برای پرسیدن یک سوال شرطی بهره برده و در نهایت با استفاده از مستطیل خروجی موردنظر را به تصویر کشیدهایم.
[/su_expand]