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

برنامهنویسی الگوریتمی پیرامون نوشتن مجموعهای از قوانین با تعداد محدودی از مراحل است که به کامپیوتر نحوه انجام یک کار را آموزش میدهد. یک برنامه کامپیوتری اساساً الگوریتمی است که به کامپیوتر میگوید برای انجام یک کار خاص چه مراحل خاصی را با چه ترتیب خاصی اجرا کند. بسته به زبان برنامهنویسی مورد استفاده، الگوریتمها با استفاده از ترکیب نحوی خاصی نوشته میشوند. یک الگوریتم شامل تعدادی از دستورات زیر است:
دستورات ورودی
دستورات خروجی
دستورات محاسباتی
دستورات شرطی
دستورات تکرار
پیشنهاد مقاله: بهترین کتابخانه های پایتون برای یادگیری ماشین
الگوریتمها چگونه کار میکنند؟
الگوریتمها را میتوان با استفاده از زبانهای برنامهنویسی، شبه کدها، فلوچارتها و جداول کنترل شرح داد. زبانهای برنامهنویسی در اختیار برنامهنویسان قرار میدهند تا الگوریتمها را از دنیای تئوری به دنیای واقعی و کاربردی وارد کنند.
روند اجرای الگوریتمها بر مبنای دریافت یک ورودی اولیه به همراه مجموعهای از دستورالعملها است. ورودی، دادههای اولیه مورد نیاز برای تصمیمگیری هستند و میتوانند به صورت اعداد یا کلمات نمایش داده شود. دادههای ورودی از طریق مجموعهای از دستورالعملها یا محاسبات که میتوانند شامل فرآیندهای محاسباتی و تصمیمگیری باشند در اختیار الگوریتم قرار میگیرند. خروجی آخرین مرحله در یک الگوریتم است که معمولا مقداری را به عنوان خروجی ارائه میکند.
به عنوان مثال، یک الگوریتم جستجو یک عبارت جستجو را به عنوان ورودی دریافت میکند و آنرا بر مبنای مجموعهای از دستورالعملها برای پایگاه داده ارسال میکند تا نتیجهای را دریافت کند. به طور مثال، نرمافزارهای اتوماسیون یک نمونه خوب از الگوریتمها در مقیاس بزرگ و واقعی هستند، زیرا اتوماسیون از مجموعهای از قوانین برای تکمیل وظایف پیروی میکند.
آشنایی با انواع مختلف و رایج الگوریتمها
الگوریتمها بر اساس مفاهیمی که برای انجام یک کار از آنها استفاده میکنند طبقهبندی میشوند. در حالی که الگوریتمها انواع مختلفی دارند، اما برخی از آنها زیربنایی هستند. از مهمترین الگوریتمهای علوم کامپیوتر به موارد زیر باید اشاره کرد:
الگوریتمهای تقسیم و غلبه (Divide and conquer algorithms): مسئله را به زیرمسالههای کوچکتر از همان نوع تقسیم کنید تا حل مسائل کوچکتر ساده شود و در ادامه راهحلها را برای حل مشکل اصلی ترکیب کنید.
الگوریتمهای جستجوی فراگیر (Brute force algorithms): تمام راهحلهای ممکن را آزمایش میکند تا یک راهحل رضایتبخش و اثربخش پیدا شود.
الگوریتم های تصادفی (Randomized algorithms): حداقل یک بار در طول محاسبات از یک عدد تصادفی برای یافتن راهحلی برای مشکل استفاده کنید.
الگوریتمهای حریصانه (Greedy algorithms): از میان راهحلهای موجود، راهحلی بهینه که قابلیت حل یک مسئله را دارد انتخاب میکند.
الگوریتمهای بازگشتی (Recursive algorithms): پایینترین و سادهترین نسخه یک مسئله را حل میکنند تا بتوان به راهحل بزرگتر رسید. به بیان دقیقتر، سعی میکند از جزء به کل برسد. الگوریتمهای بازگشتی حالت پایه مسئله را حل کرده و سپس با استفاده از این جواب، به حل مسائل تودرتو میپردازند. درواقع مسئله به چند بخش کوچک شکسته میشود که با استفاده از پاسخ مرحله قبل، مسئله بعدی قابلحل است. یکی از معروفترین مسائل بازگشتی، تابع فاکتوریل (factorial) میباشد.
الگوریتمهای عقبگرد (Backtracking algorithms): مسئله را به زیرمسئلههایی تقسیم کنید که هر کدام را میتوان برای حل مشکل مورد استفاده قرار دارد. با این حال، اگر راهحل مورد نظر به دست نیامد، در مسئله به عقب حرکت میکند تا زمانی که مسیری پیدا شود که به حل مشکل کمک کند.
الگوریتمهای برنامهنویسی پویا (Dynamic programming algorithms): یک مسئله پیچیده را به مجموعهای از مسائل فرعی سادهتر تقسیم میکنند. یکی از روشهای پرکاربرد و مشهور طراحی الگوریتم روش برنامهنویسی پویا است. این روش همچون روش تقسیم و حل (Divide and Conquer) بر پایه تقسیم مسئله بر زیرمسئلهها کار میکند. اما تفاوتهایی با آن دارد.
زمانیکه یک مسئله به دو یا چند زیرمسئله تقسیم میشود، دو حالت ممکن است پیش میآید:
دادههای زیر مسئلهها هیچ اشتراکی با هم نداشته و کاملا مستقل از هم هستند. نمونه چنین مواردی مرتبسازی آرایهها با روش ادغام یا روش سریع است که دادهها به دو قسمت تقسیم شده و به صورت مجزا مرتب میشوند. در این حالت دادههای یکی از بخشها هیچ ارتباطی با دادههای بخش دیگر نداشته و در نتیجه حاصل از آن بخش اثری ندارند. روش تقسیم و حل برای این مسائل عملکرد خوبی دارد.
دادههای زیرمسئله وابسته به هم هستند یا با هم اشتراک دارند. در این حالت به اصطلاح زیرمسئلهها همپوشانی دارند. یک مثال رایج در این زمینه، محاسبه جملهی nام دنباله اعداد فیبوناچی است.
الگوریتم تقسیم و حل (Divide and conquer ): الگوریتمهای تقسیم و حل، ابتدا مسئله را با توجه به نوع آن، به چند بخش کوچکتر تقسیم کرده و به حل آنها میپردازند. سپس از ترکیب پاسخ بخشهای کوچکتر، پاسخ کلی مسئله بهدست میآید.

نمونهای از یک الگوریتم معروف
حل مکعب روبیک
امروزه انواع مختلفی از الگوریتمهای ساده تا بسیار پیچیده، برای حل مکعب روبیک نوشته شدهاند. در ادامه یک الگوریتم ساده را مشاهده میکنید که زمان حل این معمای معروف را به میزان قابل توجهی کاهش میدهد. ابتدا، اجازه دهید یک نماد برای استفاده (مشابه انتخاب یک زبان برنامهنویسی) مشخص کنیم.
هر یک از شش وجه مکعب روبیک را میتوان با حرف اول نام آنها نشان داد:
U – بالا
D – پایین
L – چپ
R – درست است
F – جلو
B – پشت
هر وجه یا طرف را میتوان به سه روش/جهت مختلف چرخاند. با استفاده از U به عنوان مثال، این موارد به صورت زیر نمایش داده میشوند:
U – یک چهارم چرخش در جهت عقربههای ساعت قسمت بالایی وجه
U’ – ربع چرخش در خلاف جهت عقربههای ساعت قسمت بالایی وجه
U2 – نیم چرخش در هر جهت از صورت بالایی
حال بیایید مراحل الگوریتمنویسی برای حل مکعب روبیک را طی کنیم.
مرحله 1: صلیب (Cross)
ابتدا چند لبه را برگردانید تا یک صلیب سفید در قسمت بالایی ایجاد شود.
چرخشهای زیر را اعمال کنید: F، R’، D’، R، F2، R’، U، R، U’، R’، R2، L2، U2، R2، L2.
صلیب اکنون حل شده است.
مرحله 2: گوشههای سفید
لبههای روی صورت سفید اکنون کامل شدهاند، اما گوشهها باقی ماندهاند.
بسته به اینکه گوشه سفید-نارنجی-سبز در کجای پازل قرار دارد، یکی از سری چرخشهای زیر را اعمال کنید:
پایین: R’، D’، R، D (تکرار کنید تا گوشه به مکان درست خود حرکت کند)
بالا: R’، D’، R، D (این گوشه را به پایین حرکت میدهد؛ سپس دستورالعملهای بالا را دنبال کنید)
مرحله 3: لبههای لایه میانی
مکعب را برگردانید تا رنگ سفید در پایین باشد.
به دنبال لبهای باشید که در قسمت بالایی قرار دارد و رنگ زرد روی آن نباشد.
یک چرخش U را انجام دهید تا رنگ روی جلوی لبه با مرکز هماهنگ شود.
بسته به جهتی که لبه میتواند برود، یکی از سری چرخشهای زیر را اعمال کنید:
سمت چپ: U’، L’، U، L، U، F، U’، F’
راست: U، R، U’، R’، U’، F’، U، F)
مرحله 4: صلیب زرد
چرخشهای زیر را اعمال کنید تا زمانی که یک ضربدر زرد روی صورت با مرکز زرد ظاهر شود: F, R, U, R’, U’, F’.
اگر شکل “L” وجود دارد، جایی که دو قطعه زرد نشان داده شده مجاور یکدیگر هستند، چرخشهای زیر را اعمال کنید: F، U، R، U’، R’، F’.
اگر یک شکل “خط” وجود دارد که افقی است، چرخشهای زیر را اعمال کنید: F، R، U، R’، U’، F’.
مرحله 5: Sune و Antisune
در این مرحله شما ممکن است با ۷ حالت مختلف روبرو باشد که Sune و Antisune یکی از آنها و راحتترین آنهاست، اما ممکن است در نگاه اول نتوانید آنرا تشخیص دهید. در این حالت شما حداقل یک گوشه زرد رنگ دارید و لازم است تمام گوشههای لایه بالا به رنگ زرد دربیاید اگر هم اکنون تمام لایه بالایی زرد است این گام را رد کنید، در غیر این صورت مراحل زیر را دنبال کنید.
به وجهای با مرکز زرد نگاه کنید.
بسته به موارد احتمالی زیر، یکی از سریهای زیر را اعمال کنید:
اگر فقط یک گوشه جهتدار وجود دارد: R، U، R’، U، R، U2، R’ (تکرار کنید تا به موقعیت مورد نظر برسید)
یک گوشه گرا (Oriented) و یک گوشه رو به راست وجود دارد، مراحل فوق را انجام دهید: U2، R، U2، R’، U’، R، U’، R’
مرحله 6: پازل را تمام کنید
برای حل مرحله آخر باید به دنبال چراغ های جلو باشید. نگران نباشید در ۱۹ حالت از این ۲۱ حالت میتوانید آنها را پیدا کنید و فقط در دو حالت وجود ندارند که حالت اول وقتی است که شما این گام را رد میکنید که در آن حالت مکعب حل شده است و برای حل حالت دوم میتوانید از الگوریتم زیر استفاده کنید. این حالت بهترین حالت در روش حل مکعب روبیک است
به دنبال مجموعهای از “چراغهای جلو” باشید (دو برچسب همرنگ در یک ردیف که با برچسبی با رنگ متفاوت از هم جدا شدهاند).
بسته به تعداد آنها، یکی از سریهای زیر را اعمال کنید:
اگر مجموعهای از چراغهای جلو در هر طرف وجود دارد: مراحل فوق را دنبال کنید: R, U’, R, U, R, U, R, U’, R’, U’, R2
در غیر این صورت، این مراحل را آزمایش کنید R’، F، R’، B2، R، F’، R’، B2، R2.
الگوریتمهای مرتبسازی
الگوریتم مرتبسازی، الگوریتمی است که عناصر یک لیست را در یک ترتیب معین، معمولاً به ترتیب عددی یا واژگانی، قرار میدهد. مرتبسازی اغلب اولین قدم مهم در الگوریتمها است که مسائل پیچیدهتری را حل میکند. تعداد زیادی الگوریتم مرتبسازی وجود دارد که هر کدام مزایا و هزینههای خاص خود را دارند. در زیر، برخی از معروفترین الگوریتمهای مرتبسازی را به شما معرفی میکنیم:
مرتبسازی خطی (Linear sort): کوچکترین عنصر فهرست را برای مرتبسازی پیدا کنید، آن را به فهرست جدید اضافه کنید و از فهرست اصلی حذف کنید. این کار را تکرار کنید تا لیست اصلی خالی شود.
مرتبسازی حبابی (Bubble sort): دو عنصر اول لیست را با هم مقایسه کنید و اگر اولی بزرگتر از دومی است، آنها را عوض کنید. این کار را با هر جفت عنصر مجاور در لیست تکرار کنید. سپس، این فرآیند را تکرار کنید تا لیست به طور کامل مرتب شود.
مرتب سازی درج (Insertion sort): هر عنصر در لیست را با تمام عناصر قبلی مقایسه کنید تا زمانی که عنصر کوچکتری پیدا شود. این دو عنصر را عوض کنید. این فرآیند را تا مرتب شدن کامل لیست تکرار کنید.
در چه حوزههایی از علوم کامپیوتر از الگوریتمها استفاده میشود؟
الگوریتمها در هر بخش از علوم کامپیوتر استفاده میشوند. آنها ستون فقرات تمامی برنامههای مدرن امروزی هستند. در علم کامپیوتر، یک الگوریتم مجموعهای از دستورالعملها را به رایانه میدهد که به رایانه اجازه میدهد هر کاری را انجام دهد. اینکار میتواند اجرای ماشین حساب یا پرتاب موشک باشد.
برنامههای کامپیوتری در هسته خود الگوریتمهایی دارند که به زبانهای برنامهنویسی نوشته شدهاند تا کامپیوتر بتواند کاری که مقصود برنامهنویسان است را انجام دهد. لازم به توضیح است که الگوریتمهای کامپیوتری نقش مهمی در نحوه عملکرد شبکههای اجتماعی دارند: کدام پستها نمایش داده میشوند، کدام تبلیغات دیده میشوند و غیره. این تصمیمات همه توسط الگوریتمها گرفته میشود. برنامهنویسان گوگل از الگوریتمهایی برای بهینهسازی جستجوها، پیشبینی آنچه کاربران قرار است تایپ کنند و موارد دیگر استفاده میکنند. در حل مسئله، بخش بزرگی از برنامهنویسی کامپیوتری، یادگیری در مورد شکلگیری و تجزیه و تحلیل الگوریتمها است.
چرا درک الگوریتمها مهم است؟
تفکر الگوریتمی یا توانایی تعریف گامهای واضح برای حل یک مشکل، در بسیاری از زمینههای مختلف از جمله یادگیری ماشین و هوش مصنوعی بسیار مهم است. حتی اگر از آن آگاه نباشیم، همیشه از الگوریتمها و تفکر الگوریتمی استفاده میکنیم. تفکر الگوریتمی به دانشآموزان اجازه میدهد تا مسائل را تجزیه کرده و راهحلها را بر اساس مراحل گسسته مفهومسازی کنند. توانایی درک و پیادهسازی یک الگوریتم مستلزم آن است که دانش آموزان تفکر ساختاریافته و تواناییهای استدلال را تمرین کنند.
پیشنهاد میکنیم در مورد روشهایی که الگوریتمهای برنامهنویسی به توسعه مهارتهای تفکر منطقی کمک میکند، تحقیق کنید، زیرا نقش مهمی در موفقیت شما به عنوان یک برنامهنویس دارند.
کلام آخر
در یادگیری برنامهنویسی، الگوریتم یک دستورالعمل است و به مواد تشکیلدهنده آن ورودی گفته میشود . کامپیوتر، رویه شما را بررسی میکند. آن را مطابق خواسته دنبال میکند و در انتها میتوانید نتایج را که به آنها خروجی گفته میشود را مشاهده کنید. در واقع یک الگوریتم نحوه انجام کاری را توصیف میکند و رایانه شما هر بار دقیقاً این روش را انجام می دهد.


