الگوریتم چیست؟ – به زبان ساده + مثال و تمرین


در ریاضیات و علوم کامپیوتر، «الگوریتم» (Algorithm) به دنباله «محدودی» (متناهی | Finite) از دستورالعملهای بسیار دقیق (بدون ابهام) اشاره دارد که بهطور معمول برای حل نوع خاصی از مسائل یا به منظور انجام محاسبات، مورد استفاده قرار میگیرند. با این حال الگوریتمها نه تنها در علوم کامپیوتر بلکه با سراسر زندگی ما عجین شدهاند. در این مطلب از مجله فرادرس سعی کردهایم اطلاعات مفیدی را بیان کنیم تا بدانیم الگوریتم چیست و چه نقشی را در زندگی ما ایفا میکند.
الگوریتمها در واقع دنبالهای از وظایف هستند که در پاسخ به وضعیتی اولیه انجام میشوند. هنگامیکه واژه «Algorithm» به گوشمان میخورد احتمالاً تصاویری از استارتآپها و کدهای صفر و یک کامپیوتری در ذهنمان شکل بگیرد. چیزی که شاید بسیاری از ما ندانیم این است که الگوریتمها سادهتر از آن چیزی هستند که تصور میکنیم. البته که این مفهوم بهوسیله برنامهنویسان (در علوم کامپیوتر) برای تولید اپلیکیشنها مورد استفاده قرار میگیرد، اما لازم است بدانیم که کاربرد آنها تنها به همین مورد خلاصه نمیشود و در زندگی روزمره نیز از آنها به وفور استفاده میکنیم.
از کودکی آموختهایم که چگونه کارهای روزمره خود را انجام دهیم. مثلاً یاد گرفتهایم که چگونه بشماریم، مواردی را مرتب کنیم، راه برویم، بند کفشهایمان را ببندیم و غیره. میتوان گفت که تمام این فرایندها، با دستورالعملهای «قدم به قدم» به ما آموزش داده شدهاند. به بیان دیگر، ما تفکرِ الگوریتمی برای حل مسئله را ناخودآگاه یاد گرفتهایم.
الگوریتم خوب در عین حال که کارآمد است، سطحی از صحت (و درستی) را حفظ میکند. یعنی علاوه بر اینکه خطای کمی دارد، انجام آن نیز زمان زیادی از ما نمیگیرد. یکی دیگر از ویژگیهای مهم الگوریتم، «قابل درک» (Comprehensibility) بودن آن است. یعنی اگر الگوریتمی قابل فهم نباشد، نمیتوانیم بارها و بارها آن را مورد استفاده قرار دهیم. تفکر «الگوریتمی» (Algorithmic) و محاسباتی، به حدی فراگیر است که بر سادهترین چیزها در زندگی روزمره ما کنترل دارد. بنابراین اگر میخواهید با الگوریتم آشنایی کاملی پیدا کنید، تا انتهای این مطلب با مجله فرادرس همراه باشید.
مقدمه
الگوریتم، مجموعهای از دستورات را در اختیار کامپیوتر قرار میدهد تا بهوسیله آن کار خاصی انجام شود و نقش بسیار مهمی را در محاسبات و علوم کامپیوتر ایفا میکند. الگوریتمها در واقع برای حل مسائل و انجام تسکهای موجود در سیستمهای کامپیوتری استفاده میشوند. میتوان اظهار داشت که الگوریتم، مراحلی که برای تولید (ارائه) نتیجه دلخواه نیاز داریم را تعریف میکند و کامپیوتر با دنبال کردن دستورات، آن وظیفه را بهطور کارآمد و دقیق انجام میدهد.

ایجاد الگوریتمهایی با راندمان مطلوب، یکی از حوزههای مهم علوم کامپیوتر محسوب میشود و آثار چشمگیری را در حوزههای مختلف، از «رمزنگاری» (Cryptography) و «سرمایهگذاری» (Finance) گرفته تا «یادگیری ماشین» (Machine learning) و روباتیک عرضه میکند.
الگوریتمها با دریافت ورودی مشخص، همیشه خروجی یکسانی را تولید میکنند که در این صورت به آنها «الگوریتمهای قطعی» (Deterministic Algorithms) میگوییم. همچنین زمانیکه گامهای الگوریتم شامل عنصری تصادفی یا غیرقطعی باشد، میتوانند نتایج (خروجیهای) متفاوتی بهدنبال داشته باشد که این الگوریتمها به الگوریتم تصادفی معروف هستند.
پیش از ادامه این مبحث لازم است یادآور شویم که میتوانید طراحی و نوشتن الگوریتم را با استفاده از مجموعه آموزش طراحی الگوریتم شامل درس، تمرین، حل مثال و تست در فرادرس یاد بگیرید.
الگوریتم چیست ؟
اگر به ریاضیات رجوع کنیم - جایی که اصطلاح «الگوریتم» از آنجا نشئت گرفته است - میتوانیم بگوییم که الگوریتم، مجموعهای «محدود» (متناهی | Finite) و منظم از اقداماتی است که با دنبال کردن آن میتوانیم مسئلهای را حل کنیم. برای اینکه درک بهتری نسبت به این مفهوم داشته باشیم، آن را به ۲ بخشی که در ادامه آورده شده، تقسیم میکنیم.
- هر الگوریتم، مجموعهای منظم (دارای ترتیب) از عملیاتی دقیق (بدون ابهام) را در بر میگیرد. بهعبارتی دیگر، میتوان آن را «زنجیرهای از دستورالعملهای دقیق» در نظر گرفت که باید بهطور منظمی اجرا شوند.
- هدف الگوریتم این است که مسئلهای مشخص را حل کند، بنابراین هر الگوریتم، هدف تعریف شده و مشخصی دارد.
همچنین میتوانیم «الگوریتم» را بهعنوان روشی گام به گام یا مجموعه دستورالعملهایی در نظر بگیریم که به منظور حل مسئلهای خاص یا انجام تسک بخصوصی طراحی شدهاند. به عبارت دیگر، الگوریتمها، دنبالهای دقیق (معین | شفاف | Well-defined) از عملیات هستند که تعدادی ورودی دریافت میکنند، محاسباتی را انجام میدهند و در نهایت نتیجهای بهعنوان خروجی تولید میکنند. الگوریتمها در واقع اجزای سازنده و بنیادین در علوم کامپیوتر هستند و اساسِ حل مسئله در زمینههای گوناگون بهشمار میروند.
مثال تشریح الگوریتم پخت نان
برای درک بهتر این مفهوم و اینکه واقعا الگوریتم چیست، مثال سادهای را شرح میدهیم. تصویری که در ادامه آمده است، الگوریتم پخت نان تافتون را بیان میکند که شامل مراحلی گام به گام و دقیق است و دنبال کردن آنها به تولید نان تافتونِ آماده (یا همان هدفِ الگوریتم) ختم میشود.

همانطور که پیشتر هم بیان کردیم، با در نظر گرفتن «دستور پخت»، که در حقیقت، الگوریتم نسبتاً سادهای هم محسوب میشود میتوانیم درک بهتری نسبت به این موضوع داشته باشیم. در هر «مرحله» از این دستور پخت، عملِ مشخصی که ترتیب و نظم خاصی هم دارد توصیف شده است. در ادامه، این مراحل را مرور میکنیم.
- ابتدا ۲۰۰ میلیلیتر آب بههمراه ۲۰ میلیلیتر روغن زیتون را در ظرفی میریزیم.
- خمیر مایه را به محتوی ظرف اضافه میکنیم.
- بهمیزان ۵۰۰ گرم آرد و نصف قاشق چایخوری نمک را به ظرف اضافه و کل مواد را بهخوبی با هم مخلوط میکنیم.
- روی خمیر بهدست آمده را میپوشانیم و به مدت ۲۰ دقیقه به آن استراحت میدهیم.
- خمیر را با کارد به ۱۰ قسمت مساوی، تقسیم و هر تکه را با استفاده از وردنه بهخوبی صاف میکنیم.
- نانها را در فر قرار میدهیم و به مدت ۷ دقیقه و با دمای ۱۷۰ درجه سانتیگراد میپذیم.

بدین ترتیب، در این مسئله (پخت نان تافتون) با استفاده از مواد اولیه (ورودیها) و با انجام دنبالهای از مراحل (مراحل دستور پخت)، خروجی (نان تافتون آماده) به دست میآید. این الگوریتم به شکل «فلوچارت» یا «نمودار جریان» (Flowchart) هم نیز قابل بیان است.
هنگامیکه الگوریتمی را مینویسیم، هدف مطلوب و مورد نظر ما، تولید نتیجه و خروجی مناسب است و صرفاً نوشتن مجموعهای از دستورات (هر چند دقیق) - که نتیجهای بهدنبال ندارد - کافی نیست. بلکه این مراحل باید بهصورت منطقی و با هدف خاصی انجام شوند.
بهعنوان مثال، اگر الگوریتمی طراحی میکنیم که قرار است در زندگی واقعی کار کند، مراحل (گامهای) این الگوریتم میبایست شامل دستوراتی باشد که انواع موقعیتهایی که ممکن است با آن رو به رو شویم را در نظر بگیرد. بدین ترتیب، فلوچارتی که الگوریتم را تشکیل داده است شکل درخت بسیار بزرگی از «دستورالعملها» (Instructions) را به خود میگیرد که با توجه به پیچیدگی آن، حتی ممکن است نتایج غافلگیرکنندهای برایمان به دنبال داشته باشد.
همانطور که گفتیم، مجموعه گامهای (متناهی) که برای هر مسئلهای باید طی شود را الگوریتم مینامند. الگوریتمها بهطور معمول پیش از انجام کدنویسی برنامه ایجاد میشوند. با توجه به اینکه الگوریتم را میتوان با زبان نوشتاری معمولی نوشت، درک و فهمیدن آن برای افرادی که دانش برنامه نویسی ندارند نیز ساده است.
گاهی اوقات الگوریتمها را در قالب «شبهکدها» (سودو کد | Pseudocodes) - که شباهت زیادی به زبان برنامهنویسی دارند - نیز مینویسند. الگوریتمها بسته به مسئله و خروجی مدنظر ما میتوانند ساده یا پیچیده باشند.
مزایای الگوریتم چیست ؟
حال که فهمیدیم الگوریتم چیست، لازم است تا مزیتهای آن را نیز بدانیم. در ادامه، برخی از این مزایا را بیان کردهایم.
- بهراحتی قابل فهماند (Easy to understand): با توجه به اینکه نمایشی گام به گام از راهحل برای مسئله عرضه میکند، درک آن کار سختی نیست.
- زبان مستقل (Language Independent): از آنجاییکه به زبان برنامهنویسی وابسته نیست، هر کسی، حتی بدون دانش برنامهنویسی هم میتواند بهراحتی آن را درک کند.
- دیباگ / خطایابی (Debug / Error Finding): هر گامِ الگوریتم، مستقل است و دنباله منطقی مخصوص به خود را دارد. بههمین دلیل، شناسایی و رفع خطا آسان است.
- زیرمسائل (Sub-Problems): الگوریتمها بهصورت یک جریان نوشته شدهاند، پس برنامهنویس میتواند وظایف را تقسیم کند که این قضیه در نهایت منجر به سادهتر شدن کدنویسی آن میشود.
- الگوریتم از رویهای مشخص (واضح | معین) استفاده میکند.
- تسهیل فرایند حل مسئله: الگوریتمها فرایندی گام به گام و شفاف برای حل مسئله ارائه میدهند. این مورد به برنامهنویسان کمک میکند تا سردرگم نشوند و در میانه کدنویسی به مشکل بر نخورند (متوقف نشوند). همچنین به ما اطمینان میدهد که راهحل نهایی کامل و دقیق (صحیح) است.
- بهبود کارایی: الگوریتمها برنامهنویسان را یاری میدهند تا کدهایی بنویسند که اجرایی با راندمان بالاتر داشته باشد. زیرا الگوریتم، مسئله را به بخشهایی کوچکتر و متناسبتری (قابل مدیریتتری) تجزیه میکند که میتوانند برای عملکرد مورد نظر، بهینه شوند. با استفاده از الگوریتم، برنامهنویسان میتوانند کدهایی بنویسند که سریعتر اجرا میشود و از منابع کمتری استفاده میکند.

- افزایش انسجام: الگوریتمها با ارائه رویکردی استاندارد برای حل مسائل، میتوانند در پروژههای گوناگون بهکار گرفته شوند. بدین ترتیب مطمئن میشویم که مسائل مشابه، با الگوریتمی یکسان قابل حل خواهند بود، این مورد در نهایت میتواند باعث صرفهجویی در زمان شود و همچنین خطا را کاهش دهد.
- قابلیت استفاده مجدد: الگوریتمها را میتوان به دفعات در پروژههای مختلف مورد استفاده قرار داد. بدین ترتیب در زمان و تلاش توسعهدهندگان صرفهجویی میشود. پس از توسعهی یک الگوریتم، میتوان آن را با موقعیتهای جدید تطبیق داد و آن را برای حل مسائل مشابه در زمینههای گوناگون بهکار برد.
- ترویج مشارکت: الگوریتمها با ارائه زبان و رویکردی مشترک برای برنامهنویسان به آنها کمک میکنند تا با هم روی مسائل پیچیده کار کنند. بنابراین، برنامهنویسان بهسادگی میتوانند کدهای یکدیگر را بفهمند و برای حل مسائل پیچیده با هم مشارکت داشته باشند.
- بهعنوان بخشی از مستندات نرمافزار، در مراجعات بعدی و در فاز نگهداری مورد استفاده قرار میگیرد.
- بهعنوان یک طرح کلی برای کدنویسی عمل میکند.
خلاصهای از مزیتهای الگوریتم در برنامهنویسی را در جدول زیر بیان کردهایم.
مزایا | معایب |
تسهیل فرایند حل مسئله | نیازمند صرف زمان بیشتر برای توسعه |
بهبود کارایی | محدود کردن خلاقیت |
افزایش سازگاری | دشوار بودن اصلاح یا تغییر آن |
توانایی استفاده مجدد | عدم تضمین ارائه همیشگی بهترین راهکار |
کمک به همکاری و کار تیمی | مستلزم دانش و تخصص |
معایب الگوریتم چیست ؟
حال که با مزیتهای الگوریتم آشنا شدیم، لازم است تا برخی از نقاط منفی آن را نیز بیان کنیم.
- وقتگیر بودن: توسعه الگوریتم میتواند وقت زیادی از ما بگیرد، چونکه به برنامهریزی و آزمایش دقیق به منظور اطمینان از کارکرد صحیح آن، نیاز دارد. این مورد از دید برنامهنویسان - که تحت ددلاینهای شدید کار خود را انجام میدهند - میتواند یک نقطه ضعف محسوب شود. ایجاد الگوریتمهایی که راندمان بالایی را ارائه دهد علاوه بر زمانبر بودن، مهارتهای منطقی مناسبی را نیز میطلبد.
- محدود کردن خلاقیت: الگوریتمها به دلیل فراهم نمودن مجموعهای مشخص از گامها - که میبایست دنبال شوند - میتوانند دست و پا گیر باشند. این مورد میتواند توانایی و خلاقیت برنامهنویس را برای توسعه راهکارهای منحصر به فرد برای مسائل پیچیده، محدود سازد.
- اصلاح دشوار: پس از توسعه و پیادهسازی الگوریتم، اینکه بدون اختلال در پایگاهکد، آن را تغییر بدهیم یا اینکه بهروزرسانی کنیم، ممکن است کار دشواری باشد. این مورد میتواند تطابق و هماهنگی با نیازهای در حال تغییر و افزودن ویژگیهای جدید را چالش برانگیز کند.
- عدم تضمین ارائه همیشگی بهترین راهکار: با اینکه الگوریتمها رویکردی سیستماتیک (نظاممند) برای حل مسائل عرضه میکنند اما ممکن است که همیشه بهترین راهحل را در اختیارمان قرار ندهند. در برخی از موارد لازم است تا راهکار خلاقانهتری را برای دستیابی به نتیجه مطلوب بهکار ببندیم.
- نیازمند دانش و تخصص: توسعه الگوریتمی کارآمد، به دانش و تخصص زیادی در برنامهنویسی و حل مسئله نیاز دارد. این مورد میتواند برای برنامهنویسان تازهکار و کمتجربه یک نقطه ضعف محسوب شود.
- نمایش انشعاب و حلقهها در الگوریتم دشوار است.
- قرار دادن تسکها (کارهای) بزرگ در الگوریتم، سخت است.

ویژگی های یک الگوریتم خوب
از خصوصیات الگوریتمی، خوب و صحیح میتوانیم به موارد زیر اشاره کنیم.
- شامل مجموعهای از ورودیها است.
- تعداد گامهای آن محدود است.
- گامهای آن بهطور دقیق و منحصر بهفرد تعریف شدهاند.
- خروجیِ مورد نظر و مطلوب را تولید میکند.
نمونه هایی از الگوریتم در زندگی روزمره
برخی از نمونههای الگوریتم در زندگی روزمره را در ادامه فهرست کردهایم.
دستور پخت
دنبال کردن «دستور پخت» (Recipes) - طرز تهیه انوع غذا و نوشیدنی و غیره - هم دقیقاً، نوعی الگوریتم بهشمار میرود و هدف ایجاد نتیجهای تکراری است. برای بهانجام رساندن دستور پخت باید مجموعه دستورالعملهای تعیین شده را دنبال کنیم. فرض کنید که میخواهیم اُملت بپزیم. به موارد اولیه مشخصی مانند گوجهفرنگی، تخممرغ، نمک، فلفل سیاه، روغن و آویشن به مقدار مشخصی نیاز داریم که ورودی الگوریتم را تشکیل میدهند. بعد از اینکه مواد لازم را تهیه کردیم، میبایست آنها را با روش و ترتیب خاصی ترکیب کنیم (گامهای الگوریتم) و سپس بپذیم که نتیجهای قابل پیشبینی - که در اینجا املت گوجهفرنگی است - را (بهعنوان خروجی) بهدنبال دارد.
مرتب سازی برگه ها
«مرتبسازی برگهها» (Sorting Papers) نیز با وجود اینکه کار سادهای محسوب میشود اما از تفکر الگوریتمی استفاده میکند. هنگامیکه در حال مرتبسازی اسناد کاری یا شخصی خود هستیم هم در حقیقت، الگوریتمی را اجرا میکنیم. سادهترین معنایی که میتوان برای آن در نظر گرفت این است که «مجموعهای از مراحل» را برای «رسیدن به خروجی» دنبال میکنیم.
«مرتبسازی اوراق» از این جهت مثال خیلی خوبی بهشمار میرود که امکان استفاده از انواع وظایف (تسکها) و خصوصیات الگوریتمها را نشان میدهد. برای نمونه، میتوانیم فایلهای خود را بر اساس حروف الفبا، تعداد کلمات، تاریخ و بسیاری موارد دیگر مرتب کنیم. هدفی که به دنبال آن هستیم این است که فرایند سازمانی را با بهکارگیری تسکهای کوچک ساده کنیم.

بهطور مثال، فرض کنید ۲ پوشه داریم، یکی شامل برگههای «نامرتب» و دیگری شامل برگههای «مرتب شده» که در ابتدا خالی است. اگر بخواهیم برگههای موجود در پوشه برگههای نامرتب را بر اساس تاریخ و بهصورت صعودی مرتب کنیم، گامهای این الگوریتم میتواند بهصورت زیر باشد.
- شروع
- یکی از برگههای موجود در پوشه «نامرتب» را برداشته و تاریخ آن را بررسی میکنیم.
- اگر مقدار تاریخ این برگه، کوچکتر از مقدار تاریخ برگه رویی از دسته برگههای پوشه «مرتب شده» بود، برگه فعلی را روی آن قرار میدهیم. در غیر این صورت، برگههای موجود در دسته مرتب شده را به ترتیب پیمایش میکنیم تا به اولین برگهای برسیم که مقدار تاریخ آن از مقدار تاریخ برگه فعلی بزرگتر باشد، سپس برگهای که در دست داریم را روی آن میگذاریم.
- بررسی میکنیم، اگر برگهای در پوشه «نامرتب» وجود دارد، آنگاه به مرحله ۲ میرویم.
- پایان
پس از اتمام الگوریتم، به هدف مورد نظر - که پوشهای با برگههای مرتب شده بر مبنای تاریخ است - دست مییابیم.
تشخیص چهره
«تشخیص چهره» (Facial Recognition) همان مکانیزمی است که در گوشیهای هوشمند امروزی و همچنین اپلیکیشنهای شبکه اجتماعی - که امکان افزودن فیلتر به صورت فرد را فراهم میکنند - وجود دارد و بر مبنای الگوریتم مشخصی عمل میکند.
این سیستم، با استفاده از نقشه بیومتریک، ویژگیهای چهره را (از روی یک عکس یا ویدیو) ترسیم کند. سپس این اطلاعات را گرفته و با پایگاه دادهای که از چهرههای شناخته شده (و معتبر) در اختیار دارد، مقایسه تا در صورت امکان تطابقی بین آنها پیدا کند. بدینترتیب میتواند هویت فرد را تأیید یا رد کند. اما هنگامی که فقط برای اِعمال فیلترها مورد استفاده قرار میگیرد، مرحله جستجو در پایگاه داده وجود ندارد و بهسادگی یک نقشه بیومتریک از چهره فرد میسازد و فیلتر مورد نظر را روی آن اعمال میکند.
جستجوی گوگل
با توجه به اینکه روزانه چندین میلیارد جستجو در گوگل صورت میگیرد جای تعجب نیست که این موتور جستجو جایگاه بالایی را در این حوزه در اختیار دارد. موتور جستجوی گوگل در واقع، مجموعه الگوریتمهایی را شامل میشود که اهمیت اسناد (صفحات وب) نمایه شده را تعیین میکنند.
راز موفقیتِ الگوریتمیِ موتور «جستجوی گوگل» (Google Search) به ویژگی «PageRank» (رتبه صفحه) آن مربوط میشود. این فرایند، ترتیب هر یک از نتایج جستجو را تعیین میکند، بههمان گونهای که در صفحه نتایج جستجو میبینیم. بسیاری از کاربران مایلند که بر روی سایتهایی که در بالای لیست قرار گرفتهاند - و رتبه بالاتری دارند - تمرکز کنند. با اینکه الگوریتم اصلی گوگل فاش نشده است اما نحوه کار «Page Rank» مشخص است.

در اصل، این سیستم به هر یک از نتایج جستجو امتیازی را اختصاص میدهد. بدین ترتیب، صفحهای که امتیاز بالاتری را داشته باشد، در صفحه نتایج جستجو، جایگاه بالاتری دارد. میتوان گفت این امتیازها، تا حدی تحت تأثیر تعداد صفحات وبی است که با آن وبسایت، لینک شدهاند. منطق پشت این موضوع، این است که لینکهای بیشتر بهمعنای اعتبار بیشتر است. این سیستمِ «پیونددهی» (Linking) به الگوریتم گوگل کمک میکند تا نتایج را بهطور ارزشمندی سازماندهی کند.
علايم راهنمایی
برنامهریزی صورت گرفته در چراغهای راهنمایی، با در نظر گرفتن جریان ترافیکی «لحظهای» (بلادرنگ | Real-time)، حرکتهای کلی را در قالب فازهایی (مراحلی) گروهبندی میکند. برای نمونه، «عبور از یک مسیر» و «گردش به راست» در یک فاز گروهبندی میشوند. به منظور حفظ ایمنی، چراغهای راهنمایی نیازمند الگوریتم هوشمندی هستند که این فازها را تشخیص داده و همچنین حرکت را بهدرستی زمانبندی کند. هر بار که به چراغ قرمز نزدیک میشویم، سیگنال ترافیکی که در مراحل مختلفی قرار دارد، الگوریتمی را بهکار میگیرد تا بهترین زمان ادامه عبور از تقاطع را بر اساس حجم ترافیکی، برایمان تعیین کند.
برنامه زمانی اتوبوس
اگر بخواهیم نقشه (و زمانبندی) تمام مسیرهای اتوبوس شهری را بهطور دستی محاسبه و ترسیم کنیم کار سختی در پیش خواهیم داشت. بههمین دلیل برای تعیین بهترین مسیرها از الگوریتمها کمک میگیریم تا در زمان و همچنین سوخت، صرفهجویی کنیم. این نکته نیز حائز اهمیت است که الگوریتم بتواند پیشبینی کند که چه مدت زمانی طول میکشد تا اتوبوس به مکان تعیین شده برای سوار کردن مسافران برسد. این مثال را میتوان کاربردی از الگوریتمها در سیستم حمل و نقل عمومی در نظر گرفت که برای خیلی از افراد بهعنوان وسیلهای مهم و ضروری برای رفت و آمد به محل کار، فروشگاهها و مدارس تلقی میشود.
سیستم موقعیت جهانی
«سیستم موقعیت جهانی» «Global Position System | GPS» رویکردی که به سفر و «راهیابی» (Navigation) داشتیم را تغییر داد. این کار از طریق ارتباطات ماهوارهای و انتقال سیگنالی منحصر به فرد به هر یک از آنها صورت میگیرد. GPS، بهکمک این سیگنالها و بهکارگیری الگوریتمی، موقعیت کاربر را بهدست میآورد. امروزه GPS و ردیابی موقعیت مکانی بسیار فراگیر شده است و توسط اپلیکیشنهای زیادی مورد استفاده قرار میگیرد.
مواردی که بیان کردیم در حقیقت نمونههایی از کاربرد مفهوم الگوریتم در دنیای واقعی به شمار میروند که مطالعه آنها به وضوح بیانگر این است که الگوریتمها تا چه اندازه در دنیای کنونی ما فراگیر شدهاند.
الگوریتم در برنامه نویسی
حالا که فهمیدیم الگوریتم چیست، جالب است بدانیم که این مفهوم، در زندگی روزمره ما چگونه مورد استفاده قرار میگیرد. گفتیم که «الگوریتم»، رویه یا فرمولی برای حل یک مسئله بر اساس انجام دنبالهای از اقدامات تعریف شده، است. یک برنامه کامپیوتری را نیز میتوان بهعنوان یک الگوریتم پیچیده در نظر گرفت.
زمانیکه یک برنامهنویس (یا همان دِولوپر)، برنامهای را میسازد، در واقع مجموعهای از الگوریتمها را پیادهسازی میکند یا بهتر است بگوییم که، یک برنامه کامپیوتری، مجموعهای از «دستوراتی» (Commands) است که در قالب یک زبان خاص (زبان برنامهنویسی) به کامپیوتر میدهیم تا دنبالهای از «اقداماتِ» (عملیات | Operations) خاص را اجرا کند و نتیجهای را به ما تحویل دهد.
کاملاً بدیهی است که یک کامپیوتر در حالت اولیه، زبان انسان و خواستههای ما را نمیفهمد. به همین دلیل است که برنامهنویسان به منظور تعامل با کامپیوتر از زبانهای برنامهنویسی استفاده میکنند.
در حقیقت، زبان برنامهنویسی را میتوان ابزاری دانست که نقش پل ارتباطی میان زبان انسان و زبانی که برای کامپیوتر قابل فهم باشد را ایفا میکند. بنابراین برنامهنویسان میتوانند با توسعه الگوریتمها، مجموعه دستورالعملهایی را بسازند که به لطف وجود زبانهای برنامهنویسی برای کامپیوترها قابل درک باشد. البته با وجود اینکه کامپیوترها از خود ارادهای ندارند، چارهای هم جز اجرای این دستورات نمیتوانند داشته باشند.
مطلب مهم، این است که بتوانیم الگوریتمهای طراحی شده را به زبان برنامه نویسی مورد نظر خود بنویسیم. مطلب ۱۵ الگوریتم ساده با جواب و توضیح راه حل از مجله فرادرس، یکی از بهترین راهنماها برای این موضوع است.
انواع الگوریتم برنامه نویسی چیست؟
الگوریتمها را برای حل مسائل ریاضی یا حتی مواردی در زندگی روزمره میتوان مورد استفاده قرار داد. با این حال نباید از کاربردهای بسیار زیادی که در برنامهنویسی کامپیوتری دارند، غافل شویم. در ادامه میخواهیم به معرفی برخی از الگوریتمهای کامپیوتری بپردازیم. این الگوریتمها علیرغم پیچیدگیهایی که دارند، کارهای مختلفی را نیز انجام میدهند.
- الگوریتمهای «مرتبسازی» (Sorting)
- الگوریتمهای «جست و جو» (Searching)
- الگوریتمهای «حریصانه» (Greedy)
- «برنامهنویسی پویا» (Dynamic Programming)
- جستجوی «الگو» (Pattern)
- الگوریتمهای «عقبگرد» (Backtracking)
- «الگوریتمهای تقسیم و حل» یا «تقسیم و غلبه» (Divide and Conquer)
- الگوریتمهای «ریاضی» (Mathematical)
- الگوریتمهای «هندسی» (Geometric)
- الگوریتمهای «بیتی» (Bitwise)
- الگوریتمها و ساختاردادههای «گراف» (Graph)
- الگوریتمهای «تصادفی» (Randomized)
- الگوریتمهای «شاخه و کران» (Branch and Bound)
مشخصه های الگوریتم چیست ؟
الگوریتمها ویژگیهای خاصی دارند که آنها را از سایر مفاهیم برنامهنویسی متمایز میکند. در ادامه، میگوییم که خصوصیات مربوط به الگوریتم چیست.
- محدودیت (تناهی | Finiteness): یک الگوریتم، میبایست پس از اجرای تعداد محدودی دستورالعمل یا گام (سرانجام) متوقف شود. بدین ترتیب مطمئن میشویم که الگوریتم ما بهطور نامحدود (مدتی نامعلوم) اجرا نمیشود و در نتیجه برنامهنویسان میتوانند خروجی مدنظر را در بازه زمانی معقولی بهدست آورند.
- «صراحت» (Definiteness): هر یک از گامهای الگوریتم میبایست بهطور دقیق تعریف شده و ابهامی نداشته باشد (شفافیت داشته باشد). بدین ترتیب مطمئن میشویم که هیچگونه ابهام یا سردرگمی در مورد عملیات مورد نظر برای اجرا در هر گام وجود ندارد.
- ورودی (Input): هر الگوریتم، ورودیهایی را دریافت میکند که میتواند بهصورت متغیر، ساختارهای دادهای یا حتی الگوریتمهای دیگری باشد. میتوان گفت که «ورودی، اطلاعات ضروری برای اجرای الگوریتم و تولید خروجی دلخواه را فراهم میکند.
- خروجی (Output): هر الگوریتم، نتیجهای را بهعنوان خروجی تولید میکند که میتواند ساختار دادهای «تبدیل شده» (Transformed) یا یک تصمیم بر اساس ورودی آن باشد. خروجی، نتیجه اجرای الگوریتم است و میبایست با مسئله یا تسک مورد نظر همخوانی داشته باشد.
- کارآمدی (Effectiveness): طراحی الگوریتمها بهگونهای است که سودمند باشند، به بیان دیگر الگوریتمها مسئله را بهدرستی و بهطور بهینهای حل میکنند. این بهینهبودن مواردی همچون استفاده از منابع - مانند زمان و حافظه - یا قدرت (توان) محاسباتی را در بر میگیرد.
- یگانگی (Uniqueness): نتایج هر گام بهطرز یکتایی تعریف میشود و تنها به ورودی و همینطور نتیجه گامهای قبلی وابسته است.

تحلیل الگوریتم چیست ؟
تحلیل الگوریتم، بیشتر حول محورهای فهرست شده در ادامه، متمرکز است.
- میزان استفاده از پردازنده (از نظر زمان)
- مقدار حافظه اشغال شده
- میزان استفاده از فضای ذخیرهسازی
- میزان بهکارگیری شبکه
با این حال، بیشترین دغدغه را «زمان پردازنده» (CPU time) - زمان مصرفی CPU برای اجرای دستورات برنامه - به خود اختصاص داده است. همچنین باید بین «کارایی» (Performance) و «پیچیدگی» (Complexity) تفاوت قائل شویم.
کارایی: یعنی اینکه چه مقدار زمان، حافظه، فضای ذخیرهسازی یا غیره، بههنگام اجرای برنامه مورد استفاده قرار میگیرد.
پیچیدگی: بیانگر این است که احتیاجات منابع برنامه یا الگوریتم مورد نظر، با افزایش اندازه مسئله به چه صورتی رشد میکند.
توجه داشته باشید که پیچیدگی روی کارایی تأثیر میگذارد ولی برعکس این قضیه صادق نیست.
کاربردهای الگوریتم چیست ؟
در این قسمت، برخی از کاربردهای الگوریتم در حوزههای گوناگون را بررسی میکنیم.
کاربرد الگوریتمها را میتوان بهطور گستردهای در حوزههای مختلف صنعتی برای بهبود کارایی، دقت و تصمیمگیری مشاهده کرد. در ادامه، برخی از کاربردهای مهم آن را آوردهایم.
- «ساخت و تولید» (Manufacturing): الگوریتمها میتوانند منظور بهینهسازی فرایندهای تولید و مدیریت «زنجیره تأمین» ( زنجیره عرضه کالا | Supply chain)، کاهش ضایعات و افزایش کارایی مورد بهرهبرداری قرار بگیرند.
- «سرمایهگذاری» (Finance): الگوریتمها را میتوان برای تحلیل دادههای مالی و انجام پیشبینیها در این زمینه بهکار برد. همچنین معاملهگران و سرمایهگذاران را در اتخاذ تصمیمهای آگاهانه یاری میکنند.
- خدمات درمانی (Healthcare): الگوریتمها در پردازش و تحلیل تصاویر پزشکی، کمک به تشخیص بیماریها و غیره استفاده میشوند.
- خرده فروشی (Retail): الگوریتمهای این حوزه به منظور مدیریت ارتباط با مشتری، پیشنهادهای شخصیسازی شده محصول و بهینهسازی قیمتگذاری، مورد استفاده قرار میگیرند.
- حمل و نقل (Transportation): در حوزه حمل و نقل، الگوریتمها برای بهینهسازی مسیرها به منظور تحویل و انتقالات، کاهش مصرف سوخت و افزایش سرعت تحویل، مورد استفاده قرار میگیرند.
- انرژی: برای بهینهسازی تولید، پخش و مصرف انرژی و همچنین کاهش ضایعات و افزایش راندمان نیز از الگوریتمها استفاده میشود.
- «امنیت» (Security): الگوریتم به منظور تشخیص و جلوگیری از تهدیدهای امنیتی نظیر هک، کلاهبرداری و حملات سایبری نیز بهکار میروند.
در این حوزهها و همچنین بسیاری از صنایع دیگر، الگوریتمها نقش مهمی را در خودکارسازی کارها، بهبود تصمیمگیری و افزایش راندمان و کارایی کلی را ایفا میکنند.
بهعنوان مثال، وظیفه الگوریتم تابع ممکن است این باشد که ۲ عدد را دریافت و با مقایسه آنها، مقدار بیشینه را پیدا کند. ورودیها و هستند و الگوریتم بهدنبال کشف بزرگترین آنها است. فهمیدن این قضیه که الگوریتم بیان شده چگونه کار میکند، کار سختی نیست.
الگوریتمی که برنامه فتوشاپ برای برش پسزمینه استفاده میکند، احتمالاٌ تمامی پیکسلهای یک تصویر را پیمایش میکند تا «لبهها» (Edges) یا نواحی «کنتراست» (Contrast) - جاییکه تضاد بالایی در رنگها وجود دارد- را پیدا کند. برای این منظور نیز روشهای شناخته شدهای در پردازش تصویر وجود دارد.
الگوریتم «نتفلیکس» (Netflix | سرویس پخش فیلمها و سریالهای تلویزیونی)، ممکن است «دسته» (Category) ویدیوهایی که پیش از این تماشا کردهایم را با دستهبندیهای سایر فیلمهای موجود مقایسه کند، تا از این طریق، پیشنهاد یا «توصیههایی» (Recommendations) را در قالب «سیستمهای توصیهگر» به ما داشته باشد. همچنین ممکن است دادههایی که از ما در اختیار دارد را با دادههای سایر کاربران مقایسه و بر اساس فیلمهایی که آنها تماشا کردهاند، مواردی را به ما توصیه کند. باید توجه داشت که پیشبینی خروجی این الگوریتمها کمی سختتر است.
الگوریتم در هوش مصنوعی
همانطور که در تعریف «الگوریتم» اشاره کردیم، مجموعهای از مراحل یا گامهایی است که بهخوبی (بهطور واضحی) تعریف شدهاند و به منظور دستیابی به نتیجهای برنامهریزی شده میبایست انجام شوند. در حالت کلی، هوش مصنوعی را میتوان برنامهای کامپیوتری، مانند مرورگر فایرفاکس، مایکروسافت ورد و سایر برنامهها در نظر گرفت. بنابراین هر راهکار مربوط به «یادگیری ماشین» و هوش مصنوعی که با آن رو به رو میشویم از ابتدا با استفاده از الگوریتمها ساخته شدهاند.
الگوریتمها، کارهای مختلفی را در هوش مصنوعی و همچنین یادگیری ماشین انجام میدهند. بهطور معمول، این الگوریتمها قوانین، شرایط و روشهایی را تعریف میکنند که یک سیستم هوش مصنوعی در پردازش و تحلیل دادهها از آن استفاده میکند. این قضیه میتواند بهسادگیِ تعریف گامهایی باشد که هوش مصنوعی برای پردازش یک فاکتور میبایست انجام دهد تا فیلتر کردن تصاویر حاوی سگ (مثلاٌ) در دیتاستی که شامل صدها هزار تصویر است.
بهکمک الگوریتمهای یادگیری ماشین، حتی با داشتن ورودیهایی ناشناخته میتوانیم خروجیها را پیشبینی کنیم.

انواع مسائلی که الگوریتمهای هوش مصنوعی میتوانند حل کنند را میتوان به ۳ دسته کلی تقسیم کرد. این دستهها را در زیر، بیان کردهایم.
- «طبقهبندی» (Classification): الگوریتمهای طبقهبندی پیشبینی میکنند که یک آیتم متعلق به چه دسته یا طبقهای است. بهعنوان نمونه میتوانیم برنامهای را مثال بزنیم که «هرزنامه» (Spam) را از ایمیلها عادی تشخیص میدهد و جدا میکند.
- «رگرسیون» (Regression): این نوع الگوریتمها برای پیشبینی برچسب دیجیتال، بر اساس نحوه عملکرد یک شی بهکار میروند. بهعنوان مثال میتوانیم به استفاده از دادههای تاریخی برای پیشبینی قیمتهای بازار سهام را اشاره کنیم.
- «خوشهبندی» (Clustering): الگوریتمهای خوشهبندی بر اساس شباهتهای موجود در عملکرد اشیا، آنها را به گروههایی تقسیم میکند. بهعنوان مثال میتوانیم به الگوریتمی برای مرتبسازی معاملات مالی و جداکردن نمونههایی از تقلبهای احتمالی اشاره کنیم.
مثال هایی از الگوریتم
اکنون که یادگرفتیم الگوریتم چیست و همچنین با کارکرد آن آشنا شدیم، لازم است تا به منظور درک بهتر آن، مثالهایی را با هم مرور کنیم. در ادامه، مثالهای متنوعی از الگوریتمها را آوردهایم.
مثال الگوریتم چاپ اعداد ۱ تا ۲۰
در ادامه، الگوریتم چاپ اعداد ۱ تا ۲۰ را ملاحضه میکنید.
- شروع.
- متغیر را با مقداردهی میکنیم.
- متغیر را یک واحد افزایش میدهیم.
- متغیر را چاپ میکنیم.
- اگر متغیر کوچکتر یا مساوی از ۲۰ باشد، آنگاه به گام ۲ باز میگردیم.
- پایان.
مثال الگوریتم تبدیل دما از فارنهایت به سلسیوس
برای تبدیل دما از «فارنهایت» () به «سلسیوس» ()، میتوانیم الگوریتمی به شکل زیر داشته باشیم.
- شروع.
- مقدار دما را برحسب فارنهایت میخوانیم (دریافت میکنیم) و در قرار میدهیم.
- دمای جدید را با فرمول محاسبه کرده و قرار میدهیم.
- را چاپ میکنیم.
- پایان.
مثال الگوریتم ریاضی فیبوناچی
سری «فیبوناچی» (Fibonacci)، دنبالهای از اعداد هستند که با فرمول زیر تعریف میشوند.
هماطور که در ادامه ملاحضه میکنید، هر عدد از این دنباله (از عدد سوم به بعد)، از حاصلجمع ۲ عدد قبلی بهدست میآید.
الگوریتم سری فیبوناچی را در ادامه بیان کردهایم.
- شروع
- تعریف متغیرهای
- متغیرها را بهصورت مقداردهی اولیه میکنیم.
- را میخوانیم.
- این گام را تا پیش از تکرار میکنیم.
- مجموع و را در قرار میدهیم.
- را چاپ میکنیم.
- را در قرار میدهیم.
- را در قرار میدهیم.
- را یک واحد افزایش میدهیم.
- پایان
مثال الگوریتم یافتن ب م م ۲ عدد دلخواه
«بزرگترین مقسوم علیه مشترک» (Greatest Common Divisor | GCD) یا «ب. م. م»، بیانگر بزرگترین عدد بین مقسوم علیههای مشترک دو عدد است. مثال زیر که مربوط به ۲ عدد «۱۲» و «۳۰» را در نظر میگیریم.
- مقسوم علیههای عدد «۱۲» برابر با «۱، ۲، ۳، ۴، ۶ و ۱۲» است.
- مقسوم علیههای عدد «۳۰» برابر با «۱، ۲، ۳، ۵، ۶، ۱۰، ۱۵ و ۳۰» است.
مقسوم علیههای مشترک این ۲ عدد برابر با «۱، ۲، ۳ و ۶» و «ب.م.م» آنها نیز «۶» است. در ادامه الگوریتم محاسبه ب.م.م. را آوردهایم.
- شروع.
- ۲ عدد دریافت کرده و در و قرار میدهیم.
- مقسوم علیههای را محاسبه میکنیم و در قرار میدهیم.
- مقسوم علیههای را محاسبه میکنیم و در قرار میدهیم.
- اشتراک و را به دست میآوریم و در قرار میدهیم.
- اکنون، بزرگترین عدد در (مقسوم علیههای مشترک) را پیدا میکنیم و نمایش میدهیم.
- پایان.
مثال الگوریتم محاسبه فاکتوریل عددی دلخواه
«فاکتوریل» (Factorial) هر عدد، از حاصلضرب آن عدد در تمامی اعداد کوچکتر از خود بهغیر از صفر، بهدست میآید. بهعنوان مثال فاکتوریل عدد ۶ به صورت زیر محاسبه میشود.
در ادامه، الگوریتم محاسبه فاکتوریل را آوردهایم.
- شروع.
- عددی را خوانده و در متغیر قرار میدهیم.
- ۲ متغیر را بهصورت ، مقداردهی اولیه میکنیم.
- اگر بود، آنگاه به مرحله ۵، در غیر اینصورت به مرحله ۸ میرویم.
- عبارت را محاسبه میکنیم و در قرار میدهیم.
- یک واحد به اضافه میکنیم () و به مرحله ۴ میرویم.
- را چاپ میکنیم.
- پایان.
مثال الگوریتم محاسبه مساحت و محیط دایره با شعاع دلخواه
- شروع.
- عددی (شعاع دایره) را خوانده و در متغیر قرار میدهیم.
- محیط دایره را محاسبه کرده و در متغیر قرار میدهیم ().
- مساحت دایره را محاسبه کرده و در متغیر قرار میدهیم ().
- و را نمایش میدهیم.
- پایان.

مثال الگوریتم ریاضی محاسبه میانگین ۳ عدد دلخواه
برای محاسبه میانگین چندین عدد، مجموع آنها را محاسبه و بر تعدادشان تقسیم میکنیم. مثالی که در ادامه آوردهایم، الگوریتم یافتن میانگین ۳ عدد دلخواه را نشان میدهد.
- شروع.
- عدد اول را دریافت میکنیم ().
- عدد دوم را دریافت میکنیم ().
- عدد سوم را دریافت میکنیم ().
- مجموع ۳ عدد دریافتی را محاسبه میکنیم و در قرار میدهیم ().
- میانگین ۳ عدد را با تقسیم بر ۳، محاسبه میکنیم ().
- را نمایش میدهیم.
- پایان.
مثال الگوریتم جا به جایی محتویان ۲ متغیر با استفاده از متغیر کمکی
در این مثال میخواهیم گامهای لازم برای جا به جایی محتویات ۲ متغیر عددی بهنام و را بنویسیم. یعنی اگر در ابتدا، و باشد، پس از اجرای الگوریتم باید مقدارشان جابجا شود ( و ). نکته قابل توجه در این مثال، استفاده از متغیری کمکی بهنام است.
پاسخ:
- شروع.
- ۳ متغیر به نامهای ، و تعریف میکنیم.
- عدد اول را دریافت میکنیم و در قرار میدهیم.
- عدد دوم را دریافت میکنیم و در قرار میدهیم.
- محتویات را به منتقل میکنیم.
- محتویات را به منتقل میکنیم.
- محتویات را به منتقل میکنیم.
- متغیرهای و را چاپ میکنیم.
- پایان.
تفاوت فلوچارت و الگوریتم
در یکی از مطالب پیشین مجله فرادرس بهطور کامل به بررسی این موضوع پرداختیم که فلوچارت چیست و چه کاربردی دارد. «الگوریتم» (Algorithm) و «نمودار جریان» یا «فلوچارت» (Flowchart) در حقیقت، ۲ نوع ابزاری هستند که برای توصیف روند یک برنامه، مورد استفاده قرار میگیرند. در این قسمت، به بررسی تفاوتهای موجود بین الگوریتم و فلوچارت میپردازیم.
الگوریتمها و فلوچارتها را میتوان ۲ ابزار متفاوتی در نظر گرفت که در ساخت برنامههای جدید بهویژه در برنامهنویسی کامپیوتری به ما کمک میکنند. بهطور خلاصه، الگوریتم، بیانگر تحلیل گام به گام فرایند محسوب میشود و فلوچارت، گامهای برنامه را بهطور گرافیکی نشان میدهد.
نوشتن روش منطقی و گام به گام که برای حل یک مسئله بهکار میرود را الگوریتم میگوییم. به بیان دیگر، الگوریتمها همان «رویههای» (شیوههای | Procedure) حل مسئله هستند که اولین گام در فرایند حل مسائل ریاضی یا کامپیوتری بهشمار میروند.
فلوچارت نمایش «گرافیکی یا تصویری» (Graphical or Pictorial) از الگوریتم است که به منظور نمایش فرایند یا برنامه، از نمادها، «فِلِشها» (Arrows) و «اَشکال» (Shapes) گوناگونی بهره میگیرد. به بیان دیگر، با استفاده الگوریتمها میتوانیم بهسادگی متوجه شویم که یک برنامه چه کاری را انجام میدهد. در حالیکه هدف اصلی بهکارگیری فلوچارتها این است که بتوانیم روشهای گوناگون را تحلیل کنیم.
برای درک بهتر، اگر «فلوچارت» را به یک فیلم سینمایی تشبیه کنیم، الگوریتم نقش داستان این فیلم را ایفا میکند. بهبیان دیگر، الگوریتم هسته فلوچارت محسوب میشود. در حوزه برنامهنویسی کامپیوتر، بین مفاهیم الگوریتم و فلوچارت تفاوت زیادی را از جنبههای مختلفی نظیر «دقت» (Accuracy)، نحوه نمایش آنها و غیره میتوان بیان کرد. در ادامه، جدولی آوردهایم که تفاوت بین این ۲ مفهوم را بهطور خلاصه نشان میدهد.
فلوچارت | الگوریتم |
نمایشی گرافیکی (نموداری) از یک فرایند | رویه و روشی برای حل مسائل |
نمایش فرایند بهصورت نمودار اطلاعاتی بلوک به بلوک | نمایش فرایند بهصورت دستورالعملهایی گام به گام |
«ملموستر» (Intuitive) و درک آسانتر | پیچیدگی و مشکلل بودن درک آن |
دیباگ سختتر خطاها | دیباگ آسانتر خطاها |
نمایش راهکار در قالب تصویری | نمایش راهکار به زبان طبیعی (مثلاً انگلیسی) |
حل سختتر مسائل پیچیده | حل نسبتاٌ راحتتر مسائل پیچیده |
ایجاد فلوچارت زمان کمتری نیاز دارد. | ایجاد الگوریتم زمان بیشتر نیاز دارد. |
از خوارزمی تا الگوریتم
شاید بهنظر برسد که «الگوریتم» (Algorithm) مفهوم جدیدی است، اما جالب است بدانیم که پیشینه این اصطلاح به گذشتههای دور و در حدود ۹۰۰ سال پیش بر میگردد. واژه «الگوریتم» از نام فیلسوف و ریاضیدان ایرانی، محمد بن موسی خوارزمی (۱۸۵ - ۲۳۳ قمری) گرفته شده است. خوارزمی از اعضای دارالحکمه - بزرگترین کتابخانه و مرکز علمی جهان در دوران طلایی اسلام در بغداد - بود و فعالیتهای نوینی را در حوزههای ریاضیات، ستارهشناسی و جغرافیا به ثمر رساند.
یکی از آثار این دانشمند، کتاب بسیار سودمندِ «در باب هنر حسابرسی هندو» بود که ۳۰۰ سال بعد از تألیف، دوباره کشف و به زبان لاتین ترجمه شد. ترجمه این اثر، «اعداد هندو عربی» را به دنیای غرب معرفی کرد که در نهایت، جایگزین اعداد ناکارآمد و پیچیده رومی شد. سیستم اعداد هندو-عربی، بههمراه ممیز اعشاری که در این کتابِ خوارزمی تشریح شد، پایه و اساس اعدادی محسوب میشوند که امروز در سراسر جهان بهکار میرود . نام «الخوارزمی» در عنوان این کتاب پس از ترجمه لاتینی به «الگوریتمی» (Algoritmi) تبدیل شد.
کتابهای او انقلابی را در ریاضیات جهان غرب بهوجود آوردند و نشان میدادند چگونه مسائل پیچیده را میتوان به بخشهای سادهتر تقسیم و سپس حل کرد. واژههای «Algorism» و «Algorithm» نیز از شکل لاتینی نام او یعنی «Algoritmi» سرچشمه گرفتهاند.

در لاتین قرون وسطایی، «Algorismus» به معنای «سیستم اعداد اعشاری» (Decimal number system) بهکار میرفت. قرن ۱۳ میلادی، این کلمه به واژهای انگلیسی تبدیل و بهکار گرفته شد و در اواخر قرن ۱۹ میلادی، الگوریتم به معنای مجموعهای از قوانین گام به گام برای حل یک مسئله برای عموم شناخته شد. در اوایل قرن بیستم، «آلن تورینگ» (Alan Turing)، ریاضیدان و دانشمند کامپیوتر بریتانیایی، متوجه شد که چگونه -به لحاظ تئوری - یک ماشین میتواند دستورالعملهای الگوریتمی را دنبال و محاسبات پیچیده ریاضی را حل کند و این تولد عصر کامپیوتر بود. در خلال جنگ جهانی دوم، او توانست دستگاهی بسازد که با بهکارگیری الگوریتمهایی خاص، برای شکستن (کرک) کدهای Enigma (دستگاهی برای رمزگذاری) مورد استفاده قرار بگیرد.
در حال حاضر میتوان ادعا کرد که «الگوریتم» به اصطلاح نسبتاً رایجی تبدیل شده است. حتی اگر گاهی اوقات دقیقاً ندانیم که یک الگوریتم چه کاری را انجام میدهد. امروزه کارکرد الگوریتمها را در هر جایی میتوان مشاهده کرد. بهطور مثال، موارد فهرست شده در زیر را میتوان در مورد الگوریتمها بیان کرد.
- به ما کمک میکنند تا از نقطه (مکانی) A به نقطه B برسیم (مثلاً در برنامههای مسیریابی).
- جستجوهای اینترنتی ما را هدایت میکنند (اینکه چه نتایجی و بر چه اساسی به ما نشان داده شوند).
- اقلامی را برای خریدن، مواردی را برای تماشا کردن و چیزهایی را برای به اشتراک گذاشتن به ما توصیه میکنند.
در واقع، این واژه کوچک که از ایران قرون وسطی آمده است به تدریج زندگی ما را متحول میکند.
تمرین الگوریتم نویسی
در این قسمت تعدادی تمرین مطرح کردهایم که با حل آنها میتوانید توانایی حل مسأله و تفکر الگوریتمی خود را بیازمایید.
تمرین الگوریتم تشخیص زوج یا فرد بودن یک عدد
الگوریتمی بنویسید که عددی را بهعنوان ورودی خوانده سپس زوج یا فرد بودن آن را نمایش دهد.
پاسخ:
- شروع.
- عددی را از ورودی خوانده و در قرار میدهیم.
- را بر ۲ تقسیم میکنیم و نتیجه را در قرار میدهیم.
- بررسی میکنیم، اگر برابر با صفر بود، آنگاه نمایش میدهیم که «عدد زوج است».
- بررسی میکنیم، اگر برابر با صفر نبود، آنگاه نمایش میدهیم که «عدد فرد است».
- پایان.
تمرین الگوریتم جا به جایی محتوای ۲ متغیر بدون استفاده از متغیر کمکی
در این قسمت میبایست الگوریتمی بنویسید که محتویات ۲ متغیر عددی بهنامهای و را با هم جا به جا کند. یعنی اگر در ابتدا، و باشد، پس از اجرای الگوریتم باید مقدارشان برابر با و شود. توجه داشته باشید که در این تمرین، استفاده از متغیر کمکی جایز نیست.
پاسخ:
- شروع.
- ۲ عدد دریافت و در و قرار میدهیم.
- را با جمع کرده و مجدد در قرار میدهیم ().
- را از تفریق کرده و در قرار میدهیم ().
- را از تفریق کرده و در قرار میدهیم ().
- و را چاپ میکنیم.
- پایان
تمرین الگوریتم تشخیص اول بودن یک عدد
«اعداد اول» (Prime numbers)، اعدادی هستند که تنها بر خود و همچنین عدد ۱، بخشپذیرند. بهعنوان مثال، عدد ۷، یک عدد اول است. در این قسمت میبایست الگوریتمی بنویسید که تشخیص دهد که آیا عدد ورودی، عددی اول است یا خیر. نتیجه را نیز در خروجی چاپ کند.
پاسخ:
- شروع.
- عددی را از ورودی خوانده و در قرار میدهیم.
- متغیری بهنام را با مقداردهی اولیه میکنیم (مقسوم علیه).
- جذر را محاسبه و در متغیری بهنام قرار میدهیم.
- اگرمقدار کمتر از ۲ باشد به مرحله ۱۱ میرویم (ورودی، عدد اول نیست).
- اگر مقدار بزرگتر از باشد به مرحله ۱۰ میرویم (ورودی، عدد اول است).
- بررسی میکنیم که آیا بر بخشپذیر است یا خیر.
- اگر بخشپذیر بود (باقیمانده برابر با ۰ بود) به مرحله ۱۱ میرویم.
- را یک واحد افزایش میدهیم و به مرحله ۶ میرویم.
- چاپ میکنیم که «عدد اول است».
- چاپ میکنیم که «عدد اول نیست».
- پایان.
تمرین الگوریتم یافتن بزرگترین عدد در میان ۳ عدد
الگوریتمی بنویسید که که ۳ عدد را بهعنوان ورودی دریافت کند و سپس بزرگترین آنها را نمایش دهد.
پاسخ:
- شروع.
- ۳ عدد را دریافت و در ، و ذخیره میکنیم.
- عدد اول را در قرار میدهیم ().
- بررسی میکنیم که اگر بود، آنگاه را در قرار میدهیم.
- بررسی میکنیم که اگر بود، آنگاه را در قرار میدهیم.
- را (که اکنون حاوی بزرگترین عدد است) بهعنوان عدد بزرگتر نمایش میدهیم.
- پایان

سوالات متداول
اکنون که فهمیدیم الگوریتم چیست، برخی از سوالات رایج در مورد ماهیت و چیستی آن را بههمراه پاسخهای متناظرشان، با هم بررسی میکنیم.
آیا الگوریتم همان کد است؟
خیر، الگوریتم با کدهای کامپیوتری تفاوت دارد. الگوریتم را میتوان به صورتهای متنوعی مانند زبان طبیعی (مثل انگلیسی یا فارسی)، با استفاده از فلوچارت و در قالب شکلها و فِلِشها، بهصورت فهرستی شمارهدار یا شبهکدها نشان داد. الگوریتمها کارآمد و شفاف هستند و بدون اضافهگویی، بخشهای شروع، میانی و پایانی را در بر میگیرند.
انواع اصلی الگوریتم چیست ؟
الگوریتمها را بر اساس عملکردی که دارند میتوانیم به ۶ دسته کلی شامل الگوریتمهای بازگشتی، تقسیم و غلبه، برنامهنویسی پویا، حریصانه، جستجوی فراگیر و عقبگرد تقسیم کنیم.
آیا الگوریتم همان فلوچارت است؟
خیر. فلوچارت نمایش بصری یک الگوریتم محسوب میشود و الگوریتم را میتوان بهوسیله یک فلوچارت تشریح و تحلیل کرد. الگوریتم مراحلی را به ما نشان میدهد که پیروی از آن، ما را به راهحل نهایی میرساند. در حالیکه فلوچارت، چگونگی انجام فرایند را بهوسیله اتصال گامها، به ما نشان میدهد. در الگوریتمها از کلمات برای توصیف گامها استفاده میکنیم، در صورتیکه فلوچارت را میتوانیم با نمادهای مخصوصِ آن ایجاد کنیم و از این طریق به منطقیتر شدن فرایند، کمک کنیم.
Backtracking در الگوریتم چیست ؟
الگوریتم عقبگرد، بر اساس جستجوی بازگشتی «اول-عمق» (Depth-first)، روی یافتن راهکاری برای مسئله در حین فرایند جستجوی «شبه شمارشی» (ٍNumeration-like) تمرکز میکند. هنگامیکه شرایط برآورده نشود، به عقب بر میگردد و مسیر دیگری را امتحان میکند. این الگوریتم برای حل مسائل بزرگ و پیچیده مناسب است. یکی از معروفترین مثالهای الگوریتمهای عقبگرد، معمای «۸ وزیر» است.
الگوریتم مرتب سازی خطی چگونه است؟
در الگوریتم «Linear sort»، کوچکترین عنصر موجود در فهرستی که قرار است مرتب شود را پیدا و آن را به فهرست جدیدی اضافه میکنیم. این عنصر همچنین باید از فهرست اصلی حذف شود. این فرایند را آنقدر تکرار میکنیم تا اینکه لیست اولیه خالی شود.
الگوریتم مرتب سازی حبابی چگونه است؟
در «Bubble sort» دو عنصر اولِ فهرست را با هم مقایسه میکنیم، حال اگر عنصر اول بزرگتر از عنصر دوم باشد، آنها را «جا به جا» (Swap) میکنیم. این عمل میبایست با هر جفت عنصر مجاور در فهرست، تکرار شود. سپس، این فرایند را تکرار میکنیم تا زمانیکه فهرست بهطور کامل مرتب شود.
الگوریتم مرتب سازی درجی چگونه است؟
در «Insertion sort»، هر یک از عناصر موجود در فهرست را - تا هنگامیکه عنصر کوچکتری پیدا شود - با تمامی عناصر قبلی مقایسه میکنیم. در صورت کشف عنصری کوچکتر، این دو را با هم جا به جا میکنیم. این روند را تا مرتب شدن کامل فهرست میبایست تکرار کنیم.
الگوریتم مرتب سازی چیست؟
الگوریتم «مرتبسازی» (Sorting Algorithm)، فهرستی از عناصر را بهعنوان ورودی میگیرد و آنها را با ترتیب خاصی (مانند صعودی یا نزولی) مرتب میکند. از انواع الگوریتمهای مرتبسازی ميتوان به«مرتبسازی حبابی»، «مرتبسازی ادغامی»، «مرتبسازی درجی» و «مرتبسازی سریع» اشاره کرد.
الگوریتم جستجو چیست؟
هدف از طراحی «الگوریتم جستجو» (Search Algorithm)، یافتن (مکانیابی) عنصر یا آیتم خاصی درون مجموعهدادهای مشخص است. از نمونههای رایج الگوریتمهای جستجو میتوان «جستجوی دودویی» و همچنین «جستجوی خطی» را نام برد.
الگوریتم مسیریابی چیست؟
«الگوریتمهای مسیریابی» (Pathfinding Algorithms) برای تعیین مسیر بهینه بین ۲ نقطه درون گراف یا شبکه بهکار میروند. الگوریتم «دایجسترا» (Dijkstra’s) و همچنین الگوریتم جستجوی «*A» بهطور گستردهای در سیستمهای «رهیاب» (Navigation) مورد استفاده قرار میگیرند.
کاربرد الگوریتم در حوزه کامپیوتر چیست؟
الگوریتم در حوزههای مختلف کامپیوتری نظیر پردازش داده، حل مسئله، گرافیک کامپیوتری، هوش مصنوعی، مدیریت پایگاه داده، ارتباطات شبکهای، سیستمعاملها و غیره بهکار میرود.
کاربرد الگوریتم در حوزه هوش مصنوعی چیست؟
در هوش مصنوعی، الگوریتمها به منظور توسعه سیستمهای هوشمند نظیر الگوریتمهای یادیگیری ماشین، الگوریتمهای «پردازش زبان طبیعی» (NLP) و الگوریتمهای بینایی کامپیوتر بهکار میروند.
کاربرد الگوریتم در حوزه شبکه چیست؟
از کاربردهای الگوریتم در شبکه و سیستمهای ارتباطی میتوان به مواردی همچون مسیریابی، تصحیح خطا، فشردهسازی دادهها، امنیت شبکه و غیره اشاره کرد.
کاربرد الگوریتم در پایگاه داده چیست؟
الگوریتمهای پایگاه داده به منظور مدیریت و سازماندهی حجم زیادی از دادهها در پایگاه داده، همچون الگوریتمهای «نمایهسازی» (Indexing) و الگوریتمهای بهینهسازی پرس و جو، بهکار میروند.
جمعبندی
اگر مهندس نرمافزار هستید یا اینکه قدم در راه یادگیری علم داده گذاشتهاید لازم است تا با برخی از مفاهیم این حوزه همچون «الگوریتم» آشنایی داشته باشید. «الگوریتم» در واقع، قلب تپنده فناوریهای بالقوه قدرتمندی همچون هوش مصنوعی محسوب میشود و برخی از افراد بهجای اینکه به آینده الگوریتمها فکر کنند، آینده را متعلق به الگوریتمها میدانند.
در این مطلب از مجله فرادرس یادگرفتیم که الگوریتم چیست. همچنین تعریف، مثالها و کاربردهای آن را نیز هم در زندگی واقعی و هم در برنامههای کامپیوتری، مورد بررسی قرار دادیم. در انتها نیز تمرینهایی را بیان کردیم که با حل آنها میتوانید توانایی خود را در رابطه با این موضوع مهم بسنجید.
الگوریتمها در حال حاضر پایه و اساس فناوریهای یادگیری خودکار یا «یادگیری ماشین» (Machine Learning) بهشمار میروند. در نتیجه هر روز ما را با ویژگیهای جدید شگفتزده میکنند. امروزه، الگوریتمها در پسِ پرده فناوریهایی مثل «دستیاران مجازی» یا «خودروهای خودران» قرار دارند و در آینده شاهد کاربردهای شگفتآوری از آنها خواهیم بود.
تفکر الگوریتمی یا توانایی تعریف گامهایی مشخص و دقیق برای حل مسئله، در بسیاری از حوزههای گوناگون همچون یادگیری ماشین و هوش مصنوعی اهمیت زیادی دارد. ما همیشه (و حتی ناخودآگاه) از الگوریتمها و همچنین تفکر الگوریتمی استفاده کردهایم. تفکر الگوریتمی این قابلیت را در اختیار افراد قرار میدهد تا مسائل را تجزیه و راهکارها را بر حسب گامهای گسسته مجسم کنند. علاقهمندان برای اینکه بتوانند الگوریتمی را بهدرستی درک و پیادهسازی کنند نیاز است تا تفکر ساختیافته و توانایی استدلال را تمرین کنند.
آینده، نیازمند الگوریتمهایی شفافتر است. الگوریتمهایی که فهمیدن آنها کار سختی نیست و میتواند در دسترس افرادی با مهارتهای مختلف قرار بگیرد و این چالش بزرگی برای همه ما محسوب میشود.
خیلی عالی بود مطالب خواستم بدانم الگوریتم حجم و سه نو مبلغ این فرمول برای محاسبه
– **SP**: هزینه کل بهای خدمات در سال
– **K**: درصد پرت و کوچکترین یا مساوی ۱
– **CGi**: حجم کل متر مکعب خانگی تجاری صنعتی
– **Sti**: نوع مصرف خانگی تجاری صنعتی با سه نرخ میانگین ۱۲۴۰ ریال
با سلام و احترام
تمایل دارم از مدل های الگوریتم برای کنترل و پیشگویی روند حوادث ناشی از کار در محیط های صنعتی استفاده کنم.
خوشحال خواهم شد اگر در این زمینه بتوانید کمکم کنید.
با تشکر
سعید علی نیا
good
جواب اینو میشه بهم بگید
تعریفی از الگوریتم ارائه نمایید که در ان زبان دقیق جزئیات کافی ترتیب مراحل وخاتمه پذیری عملیات مشخص شده باشد