همهی ما و حتی کسانی که تا کنون برنامه نویسی نکردهاند میدانیم که کامپیوترها و سیستمهای کامپیوتری برای انجام هر کاری نیاز به برنامه یا Program دارند. اما برنامه نویسی معمولاً با نوشتن برنامه آغاز نمیشود. قبل از نوشتن برنامه لازم است گام به گام، کارهایی را که باید برنامه انجام دهد تعریف کنیم که به این تعریف گام به گام عملیات، طراحی الگوریتم (Algorithm) گفته میشود.
میتوان گفت کسانی که کدنویسی بلدند، الگوریتم را به یک برنامه قابل اجرا در کامپیوترها تبدیل میکنند.
اگرچه همهی برنامهنویسان با الگوریتمنویسی آشنا هستند، و بسیاری از متخصصان الگوریتم هم، کمی برنامهنویسی میدانند؛ اما در سطح تخصصی، این دو مهارت از یکدیگر فاصله میگیرند. یعنی طراحان الگوریتم برای پیادهسازی الگوریتمهایشان از برنامهنویسان کمک میگیرند و برنامهنویسان هم برای طراحی یا بهبود الگوریتمهای خود به سراغ متخصصهای این حوزه میروند.
کسانی که در محیطهای سازمانی فعالیت میکنند، با تصور فرایندهای عملیاتی کسب و کار میتوانند تا حد زیادی مفهوم الگوریتم را درک کنند.
فرایندی که یک نامه یا سند از رسیدن به دبیرخانه تا طبقه بندی و بررسی و ارجاع و اقدام و بایگانی طی میکند، در الگوی ذهنی برنامه نویسان یک الگوریتم محسوب میشود که با گامهای متوالی و با تعریف مشخص و تقدم و تأخر مشخص که از نقطهای شروع میشوند و در نقطهای به پایان میرسند و ممکن است دهها و صدها و هزاران بار تکرار شوند.
دانشآموزان هم احتمالاً با مرور مراحل ضرب دو عدد ده رقمی در یکدیگر، میتوانند به خوبی مفهوم الگوریتم را درک و تصور کنند.
مفهوم الگوریتم
برای توضیح بهتر مفهوم الگوریتم بهتر است آن را به دو بخش “الگو” و “ریتم” تقسیم کرده و بصورت جداگانه بررسی کنیم.
الگو همان مدل است و مدل شکلی از واقعیت پدیدهها است که در ذهن شکل میگیرد و برای تجزیه و تحلیل دقیق، آنها را با روی کاغذ آوردن و یا رسم کردن در نرم افزارها از حالت انتزاعی خارج میکنیم.
ریتم همان فرایند است و فرایند مجموعه مراحلی است منظم برای به سرانجام رسیدن و خلق یک خروجی مثبت و مشخص.
به عبارت سادهتر در حقیقت برای طراحی و اجرای یک الگوریتم نیازمند ساخت مدل هستیم که این مدل در قالب یک فرایند تحقق مییابد. پس میتوان گفت که الگوریتمها، مدلهایی فرایندمحور برای برقراری نظم هستند.
بسیاری از کارهای شخصی ما دارای الگوریتم مشخص و روتین از پیش تعیین شده هستند. گاهی اوقات هم، ما ناآگاهانه الگوریتم مشخصی را انتخاب و استفاده میکنیم.
اما وقتی مقیاس فعالیتها و مسئلهها بزرگتر میشود، بیش از هر زمان دیگری احساس میکنیم که نیازمند الگوریتم هستیم.
اگر تصمیم بگیرید در کنار چهار یا پنج نفر از دوستانتان برای یک عکس یادگاری به ترتیب قد بایستید، احتمالا بدون اینکه آگاهانه توجه کنید، الگوریتمی را اجرا خواهید کرد. اما اگر قرار باشد یک صف صد نفری از دانشآموزان، به ترتیب قد مرتب شوند، اینجا همهی ما حس میکنیم که باید الگوریتم شفاف و دقیق تعریف شود. حتی میتوانیم چند الگوریتم متفاوت برای این هدف را براساس معیارهای مشخص، مقایسه و طبقهبندی کنیم.
اگر پیش از این با الگوریتم و مفهوم آن آشنا نبودهاید، شاید بد نباشد در همینجا کمی به مرتب کردن دانشآموزان به ترتیب قد فکر کنید و اینکه اگر شما باشید چگونه این کار را انجام میدهید.
برای اینکه کمی پیچیدگیهای طراحی الگوریتم را حتی در همین مثال ساده هم تجربه کنید، میتوانید دو حالت زیر را به صورت جداگانه در نظر بگیرید:
- میخواهید این کار در سریعترین زمان ممکن انجام شود.
- میخواهید مجموع مسافتی که دانشآموزان برای این مرتبسازی طی میکنند، کوتاه باشد.
در واقع میان دو الگوریتم متفاوت، گزینهای را ترجیح میدهید که مجموعاً دانشآموزان را به تحرک کمتری وادار کند.
اهمیت الگوریتم
الگوریتم نویسی کمک میکند که نیازمندیهای مسئله مشخص شده و سپس مسئله مورد تحلیل قرار بگیرد. پس از تحلیل مسئله، نوبت به طراحی الگوریتم میرسد و در نهایت الگوریتم به صورت فلوچارت پیاده سازی گردیده و بر اساس عملیات مشخص شده در آن برنامه نویسی شروع میشود.
در طراحی فلوچارت برای هر نوع دستور از یک شکل هندسی استفاده میشود. مثلاً برای شروع و پایان از بیضی، و از متوازی الاضلاع برای نمایش داده های ورودی و خروجی استفاده میشود.
ولی بطورکلی الگوریتم زمانی برای افرادی به جز برنامهنویسان از اهمیت برخوردار میشود که بتوانند عادت کنند تا با مدل ذهنی یک برنامه نویس، برای هر تصمیمی که میگیرند یا برای حل هر مسئله ای که در زندگی با آن روبرو میشوند، یک الگوریتم طراحی کرده و مجموعه ای از اقدامات را در راستای حل مسئلهای در زندگی تعریف نمایند و سپس به هر اقدام یک شماره اختصاص بدهند و آنها را به ترتیب اجرا کنند. استفاده از این شیوه مدل ذهنی به افراد کمک میکند که تصمیمگیری یا حل مسئله را بصورتی راحتتر و سریعتر انجام بدهند و از مزایای آن برخوردار شوند.
نمایش الگوریتم
گاهی اوقات الگوریتمهای ساده را میتوان به صورت گام به گام با چند شماره گذاری شرح داد. ولی وقتی الگوریتمها پیچیدهتر میشود از فلوچارت (Flowchart) برای نمایش آنها استفاده میشود. فلوچارت در زبان فارسی به روندنما ترجمه شده است.
این نکته را به خاطر داشته باشید که فلوچارتها یکی از ابزارهای شناخته شده برای نمایش ساختار الگوریتمها هستند.
طبیعتاً کسانی که به برنامه نویسی علاقه دارند، گاهی از کدهای برنامهنویسی و نیز برنامههای سمبلیک هم برای نمایش الگوریتم استفاده میکنند.
برنامههای سمبلیک برای اجرا در یک زبان برنامهنویسی خاص نوشته نشدهاند، اما برای کسانی که برنامهنویسی میدانند آشنا و قابل درک هستند.
در اینجا چند خط برنامه جنریک یا همان برنامه سمبلیک را برای نمایش یک الگوریتم مشاهده میکنید:
M and N as Integer Variable
Get N from User
Loop For M from 1 to 100
If Division N < 10 Then N = Log (N)
Loop M Closed
الگوریتمهای رایج
معمولاً آموزش الگوریتم را با الگوریتمهای مرتب کردن که اصطلاحاً Sorting نامیده میشوند آغاز میکنند.
مثالی هم که در ابتدای این مطلب برای مرتب کردن دانشآموزان بر اساس قد مطرح شد، از همین جنس بود.
اما دنیای تکنولوژی انبوهی از الگوریتمها را در اطراف ما قرار داده که معمولاً بدون اینکه به آنها توجه کنیم، از نتایجشان استفاده میکنیم.
بطورمثال الگوریتمهای مورد استفاده در موتورهای جستجو برای پیدا کردن بهترین پاسخها برای پرسش کاربران و یا در شکل کلیتر، الگوریتمهای پیشنهاددهنده که در بسیاری از نرمافزارها از جمله شبکه های اجتماعی و خرده فروشی های دیجیتال مثل آمازون و دیجی کالا دائماً از آنها استفاده میکنیم و یا اینکه آنها از ما استفاده میکنند.
البته الگوریتمهای رمزنگاری که میکوشند امنیت تبادل اطلاعات در شبکههای ارتباطی را افزایش دهند یا الگوریتمهای فشرده سازی اطلاعات که حجم دادهها را تا حد امکان کاهش میدهند هم از این دسته محسوب میشوند.
بدیهی است مبحث الگوریتم دانشی تخصصی است که گوشهای از آن میتواند برنامه حرفهای عمر کامل یک متخصص را به خود اختصاص دهد.
بنابراین، هر آنچه در اینجا به آن اشاره شد، نکاتی بسیار ابتدایی بود تا صرفاً این مفهوم برای شما شفافتر شود.
در انتها اگر با بحث الگوریتمها آشنا هستید، خوشحال می شویم نکات دیگری را که به ذهنتان میرسد با ما به اشتراک بگذارید؟