الگوریتم

الگوریتم یا  خوارزمی مجموعه‌ای نامتناهی(بی پایانی)از دستورالعمل‌ها است، که به ترتیب خاصی اجرا می‌شوند و مسئله‌ای را حل می‌کنند. 

در ریاضیات و علوم کامپیوتر، یک الگوریتم یک دنباله محدود از دستورالعمل‌های کاملاً تعریف شده‌است که معمولاً برای حل یک کلاس از مسائل خاص یا انجام یک محاسبات استفاده می‌شود. الگوریتم‌ها به عنوان مشخصاتی برای انجام محاسبات، پردازش داده‌ها، استدلال خودکار، تصمیم‌گیری خودکار و سایر وظایف استفاده می‌شوند. شیوه محاسبه معدل در مدرسه، یکی از نمونه‌های الگوریتم است.تلفن همراه بخاطر خوارزمی وجود دارد.

خصوصیات یک الگوریتم 
تمام الگوریتم‌ها (خوارزمی‌ها) باید شرایط و معیارهای زیر را دارا باشند:
 دننه ییز:
یک الگوریتم باید هیچ ورودی را پردازش نکند
 وتون:
الگوریتم بایستی حداقل یک کمیت به عنوان خروجی (نتیجهٔ عملیات) تولید کند
 قطعیت:
دستورهای الگوریتم باید با زبانی دقیق و بی‌ابهام بیان شوند. هر دستورالعمل نیز باید انجام‌پذیر باشد. دستورهایی نظیر «مقدار ۶ یا ۷ را به x اضافه کنید» یا «حاصل تقسیم پنج بر صفر را محاسبه کنید» مجاز نیستند؛ چرا که در مورد مثال اول، معلوم نیست که بالاخره چه عددی باید انتخاب شود، و در خصوص مثال دوم هم تقسیم بر صفر در ریاضیات تعریف نشده‌است.

به عبارت دیگر برای هر ورودی باید یک پردازش صحیح تعریف شده باشد
 محدودیت:
الگوریتم باید دارای شروع و پایان مشخصی باشد، به نحوی که اگر دستورهای آن را دنبال کنیم، برای تمامی حالت‌ها، الگوریتم پس از طی مراحل، خاتمه یابد. به علاوه، زمان لازم برای خاتمه الگوریتم هم باید به گونه‌ای معقول و کوتاه باشد.

عوامل مؤثر در ارائهٔ یک الگوریتم 
به‌طور کلی جهت ارائهٔ یک الگوریتم کامل به ۵ مؤلفهٔ اصلی احتیاج داریم که عبارتند از:
 مقادیر معلوم
 خواستهٔ مسئله
 عملیات محاسباتی
 دستورهای شرطی
 دستورهای تکرار (حلقه‌ها)

اطلاعات اولیه‌ای که در اختیار ما قرار می‌گیرد و با استفاده از آن‌ها به ارائهٔ راه حل می‌پردازیم شامل مقادیر معلوم مسئله هستند و نتایجی که بر اثر انجام عملیات محاسباتی به‌دست می‌آیند خواسته‌های مسئله نامیده می‌شوند.

از آنجایی که هدف اصلی طراحی الگوریتم برای حل یک مسئله دستیابی به خواسته‌های مسئله می‌باشد بنابراین طی مراحل ۵ گانهٔ بالا در ارائهٔ الگوریتم الزامی است.

یک الگوریتم شامل دستورالعمل‌های پشت سر هم است که جهت ارائهٔ یک خروجی معتبر باید به ترتیب اجرا شوند، از این رو رعایت ترتیب در مولفه‌های اصلی نیز مؤثر است، چرا که اساساً بدون وجود خواستهٔ مسئله عملیات محاسباتی نیز وجود نخواهد داشت.

با به‌کارگیری دستورهای شرطی می‌توان خروجی و رفتار یک الگوریتم را با توجه به شرایط از پیش تعیین شدهٔ مسئله کنترل کرد، از سوی دیگر استفاده از دستورهای تکرار (حلقه‌ها) به برنامه‌نویس کمک می‌کنند یک دستور تکراری را چندین بار اجرا کند.

ریشه واژهٔ الگوریتم 
واژه الگوریتم از نام شمېرپوه و ستاره‌شناس و جغرافی‌دان نامی ایرانی ، ابوجعفر محمد بن موسی خوارزمی (الخوارزمي)، گرفته شده‌است، که در خوارزم متولد شد و در دانشگاه «بیت الحکمه» بغداد به اوج شهرت رسید. خوارزم یکی از شهرهای «ایران بزرگ» بود، که امروزه در ازبکستان واقع شده‌است و خیوه نام دارد. رساله‌ای که خوارزمی در سده ۹ میلادی به عربي نگاشته بود، در سده ۱۲ به لاتین با نام ترجمه شد؛ یعنی «[کتابی بدست] «الگوریتمی» در مورد اعداد هندی»، که «الګوریتمی» نام الخوارزمی بود که مترجم در تبدیل به لاتین نام وی را جلوی نام اصلی کتاب (در مورد اعداد هندی) آورده بود. در سده ۱۳ میلادی واژه الګوریسموس به معنای «سیستم شمارش عربی (دهدهی)» (یعنی اعداد ۱ تا ۹ به علاوه صفر، و نیز مفهوم اعشار) بود؛ که هنوز هم یکی از معانی واژه الګوریسم است. معنای دیگر الګوریسم «حساب کردن با کمک اعداد عربی» است؛ یعنی فن انجام اعمال حسابی پایه، مانند جمع و ضرب، با قرار دادن اعداد در زیر هم و اعمال قواعدی خاص، که جایگزین به‌کارگیری اعداد رومی و استفاده از چرتکه شد. حتی روش انجام دستی تقسیم و جذر گرفتن (رادیکال) هم الګوریسم نامیده می‌شود. در سده ۱۹ این کلمه در فرانسوی به تغییر شکل پیدا کرد، البته معنایش ثابت ماند. طولی نکشید که این کلمه به شکل وارد زبان انگلیسی شد؛ ولی فقط در اواخر سده ۱۹ میلادی بود که معنای عام‌تر امروزی‌اش را یافت، و به «هر مجموعه قواعدی که برای انجام یک رویه محاسباتی یا روال رایانه‌ای به کار رود» الگوریتم گفته شد.

تبدیل نام الخوارزمی به الگوریسم و سپس الگوریتم احتمالاً تحت تأثیر واژه یونانی (به معنای عدد) و (به معنای محاسباتی) بوده‌است. برخی منابع هم کلمه لگاریتم را هم در تبدیل الگوریسم و الگوریتم بی تأثیر ندانسته‌اند.
الگوریتم های

نقش الگوریتم‌ها در علوم رایانه 
در علوم رایانه، یک الگوریتم را یک روال محاسباتی خوش‌تعریف می‌دانند، که مقدار یا مجموعه‌ای از مقادیر را به عنوان ورودی (Input) دریافت کرده و پس از طی چند گام محاسباتی، ورودی را به خروجی (Output) تبدیل می‌کند. بجز این، الگوریتم را ابزاری برای حل مسائل محاسباتی نیز تعریف کرده‌اند. ساخت و طراحی الگوریتم مناسب در مرکز فعالیت‌های برنامه‌سازی رایانه قرار دارد. یک برنامه رایانه‌ای، بیان یک یا چند الگوریتم با یک زبان برنامه‌نویسی است.

پیشینه 
اولین الگوریتم‌های نوشته‌شده در میان‌رودان پیدا شده‌اند. این‌ها فرمول‌هایی برای استخراج ریشه‌ها مربوط به سال ۲۰۰۰ پ.م هستند. یعنی پیشینهٔ الگوریتم‌ها به ۴ هزار سال پیش بازمی‌گردد.

در یونان باستان الگوریتم‌های مختلفی کاربرد داشته است. از جمله الگوریتمی برای محاسبهٔ بزرگترین مقسوم علیه مشترک، غربال اراتستن برای یافتن اعداد اول و الگوریتم ارشمیدس برای تقریب عدد پی.

در مصر باستان نیز روش هرون برای یافتن مساحت مثلث جزو الگوریتم‌های قدیمی به شمار می‌آید.

مفهوم الگوریتم 
مفهوم الگوریتم را معمولاً با تشبیه به دستور آشپزی توضیح می‌دهند. به‌طور مثال اگر بخواهیم آبگوشت درست کنیم (عمل مورد نظر) با فرض اینکه مواد خام را داریم (حالت اولیه) مراحل مشخصی را باید طبق دستور آشپزی طی کنیم (دستورالعمل‌ها) تا به آبگوشت آماده (حالت پایانی) برسیم. البته الگوریتم‌ها معمولاً پیچیده‌تر از این هستند.

الگوریتم گاه دارای مراحلی است که تکرار می‌شود (در مثال آبگوشت مثلاً چند بار باید نمک زد یا آب اضافه کرد) یا در مرحله‌ای نیازمند تصمیم‌گیری است (اگر نمک کافی است دیگر نمک نمی‌زنیم، اگر کافی نیست نمک می‌زنیم).

اگر الگوریتم برای عمل مورد نظر مناسب نباشد یا غلط باشد به نتیجه مورد نظر نمی‌رسیم؛ مثلاً اگر الگوریتم آبگوشت را با مواد اولیه کباب انجام دهیم واضح است که به آبگوشت نمی‌رسیم.

باید بدانیم برای هر الگوریتم تعریف متغیرها و طراحی مرحله به مرحله بسیار مهم است؛ زیرا الگوریتم باید بداند بر روی چه متغیرهایی، چه اعمالی را انجام دهد و نتیجه را در قالب چه متغیرها یا پارامترهایی نشان دهد.

مقدمه‌ای بر تحلیل الگوریتم 

معمولاً برای حل یک مسئله، روش‌ها و الگوریتم‌های گوناگونی وجود دارند؛ یک الگوریتم ممکن است عمل مورد نظر را با دستورهای مختلف در مدت زمان یا کار کمتر یا بیشتری نسبت به الگوریتم دیگر انجام دهد. به همین دلیل، انتخاب الگوریتم مناسب و کارا اهمیت زیادی در موفق بودن و کارایی برنامه رایانه‌ای دارد. الگوریتم‌ها به عنوان یک علم مطرح هستند و دانشمندان آن‌ها را طراحی، تحلیل، و مطالعه می‌کنند.
مطالعه الگوریتم‌ها زمینه‌های متعددی را در بر می‌گیرد. در زیر به چند نمونه اشاره می‌کنیم که می‌توان آن‌ها را چرخه حیات یک الگوریتم نامید.

الف) طراحی الگوریتم‌ها: روش‌های مختلفی برای طراحی الگوریتم‌ها وجود دارد که عبارتند از: روشهای تقسیم و غلبه، روش‌های حریصانه، روش‌های برنامه‌نویسی پویا، روش‌های پسگرد و روش‌های انشعاب و تحدید.

ب) معتبر سازی یا اثبات درستی الگوریتم‌ها:بعد از طراحی باید اثبات شود که الگوریتم مزبور درست است. الگوریتمی درست است که به ازای هر ورودی مناسب خروجی صحیحی بدهد. اثبات درستی الگوریتم‌ها به اثبات قضایا در ریاضی می‌ماند و مرحله بسیار مهمی در زمینه مطالعه الگوریتم‌ها است

پ) تحلیل الگوریتم‌ها (تحلیل مقدم، ارزیابی کارایی الگوریتم‌ها):یک الگوریتم در زمان اجرا از واحد پردازش مرکزیِ رایانه برای اجرای دستورالعمل‌ها و از حافظه برای ذخیره‌سازی برنامه و داده‌ها استفاده می‌کند. تحلیل یک الگوریتم مشخص می‌کند که الگوریتم در زمان اجرا برای چه مدتی از CPU برای اجرای دستورالعمل (پیچیدگی زمانی) استفاده کرده و چه مقدار از حافظه (چه اصلی و چه جانبی) برای ذخیره‌سازی برنامه و داده‌ها (پیچیدگی فضایی) به کار برده‌است. تحلیل الگوریتم بیان‌گر آن است که، یک الگوریتم به چه میزان پیچیدگی زمانی و پیچیدگی فضایی نیاز دارد.

ت) پیاده‌سازی الگوریتم‌ها:پیاده‌سازی یک الگوریتم نوشتن آن به زبان برنامه‌نویسی خاص است که معمولاً بعد از تحلیل مقدم آن صورت می‌گیرد و نام برنامه به آن داده می‌شود.

ث) تست برنامه:تست یک برنامه شامل۱:اشکال زدایی و ۲:تحلیل مؤخر (اندازه‌گیری کارایی) است. اندازه‌گیری کارایی عبارت است از فرایند اجرای الگوریتم صحیح بر روی داده‌های نمونه‌گیری شده برای به دست آوردن زمان و حافظهٔ مورد نیاز توسط کامپایلر.
زمان اجرای یک الگوریتم به پارامترهای مختلفی بستگی دارد که از جمله می‌توان به نوع دستورالعمل‌ها (دستورالعمل‌های جمع، ضرب، نوشتن، خواندن، شرطی و…)کامپایلر مورد استفاده، زبان برنامه‌نویسی، سخت‌افزار به کار رفته و پارامتری مثل nکه می‌تواند معرف تعداد ورودی‌ها و خروجی‌ها یا هر دو باشد اشاره کردتحلیل الگوریتم‌ها رشته‌ای است که به بررسی کارایی الگوریتم‌ها می‌پردازد. تحلیل الگوریتم‌ها یعنی پیش‌بینی منابع مورد نیاز برای اجرای یک الگوریتم، همچون: حافظه، پهنای‌باند ارتباطی، سخت‌افزار، و از همه مهمتر، زمان.
کارایی یا پیچیدگی هر الگوریتم را با تابعی نشان می‌دهند که تعداد مراحل لازم برای اجرای الگوریتم را برحسب طول داده ورودی، یا میزان محل‌های لازم حافظه را بر حسب طول داده ورودی نشان می‌دهد.

 جنبه حقوقی 
در بعضی کشورها، مثل آمریکا اگر تعبیه فیزیکی الگوریتمی ممکن باشد (برای مثال، یک الگوریتم ضرب که می‌شود آن را در واحد محاسبهٔ یک ریز پردازنده تعبیه کرد) می‌شود آن الگوریتم را به ثبت رساند.

 الگوریتم‌شناسی 

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

 جستارهای وابسته 

 فلوچارت
 الگوریتم‌های مرتب‌سازی
 الگوریتم کروسکال
 الگوریتم حریصانه
 مرتب‌سازی حبابی
 پیچیدگی زمانی
 پیچیدگی فضا
 الگوریتم ژنتیک
 الگوریتم ای استار
 الگوریتم جریان داده‌ها
 الگوریتم تقسیم و حل
 الگوریتم دکسترا
 الگوریتم متروپلیس-هیستینگز
 الگوریتم جستجوی اول عمق
 الگوریتم رقابت استعماری
 الگوریتم حریصانه
 الگوریتم تقسیم و حل
 برنامه‌نویسی پویا
 الگوریتم قطعی
 الگوریتم‌های تصادفی

 پانویس 

 منابع 

 Knuth, Donald. The Art of Computer Programming (Volume 1 / Fundamental Algorithms), 2nd Printing. USA: Addison-Wesley Publishing, 1969.
 Cormen, Thomas H. (et al), Intorduction to Algorithms (2nd Edition)'', USA: McGraw-Hill, 2001. 

 هورویتز، الیس. طراحی الگوریتم‌ها، چاپ دوم (مترجم: علیخانزاده، امیر). مشهد: پرتونگار، ۱۳۸۵.

منابع برای مطالعه بیشتر 
 کتاب الگوریتم - پدید آورنده: دکتر محمد پارسا عفت روش
 شیرعلی شهرضا و شیرعلی شهرضا - آموزش سریع الگوریتم‌ها
 درس و کنکور طراحی الگوریتم - نوشته مهندس حمید رضا مقسمی - انتشارات گسترش علوم پایه
 کتاب طراحی الگوریتم - جعفرنژاد قمی
 مقدمه‌ای بر الگوریتم‌ها - پدیدآورنده: توماس اچ کورمن، چارلز لیزرسان، رونالد دیوست، کلیفورد استین - گروه مهندسی-پژوهشی خوارزمی (مترجم) - ناشر: درخشش
 تحلیل و طراحی الگوریتم‌ها (رشته رایانه) - پدیدآورنده: احمد فراهی، جعفر تنها - ناشر: دانشگاه پیام نور

الگوریتم‌ها
رایانه
علوم نظری رایانه
منطق ریاضی
ویکی‌سازی رباتیک