الگوریتم
روشی گام به گام و دقیق برای حل مسائل From Wikipedia, the free encyclopedia
روشی گام به گام و دقیق برای حل مسائل From Wikipedia, the free encyclopedia
الگوریتم[1][2] مجموعهای متناهی از دستورالعملها است، که به ترتیب خاصی اجرا میشوند و مسئلهای را حل میکنند.
در ریاضیات و علوم کامپیوتر، الگوریتم دنبالهای محدود از دستورالعملهای کاملاً تعریف شدهاست که معمولاً برای حل یک کلاس از مسائل خاص یا انجام محاسبات استفاده میشود. الگوریتمها به عنوان مشخصاتی برای انجام محاسبات، پردازش دادهها، استدلال خودکار، تصمیمگیری خودکار و سایر وظایف استفاده میشوند. شیوه محاسبه معدل در مدرسه، یکی از نمونههای الگوریتم است.
تمام الگوریتمها باید شرایط و معیارهای زیر را دارا باشند:[3]
یک الگوریتم باید هیچ یا حداقل یک پارامتر را به عنوان ورودی بپذیرد
الگوریتم بایستی حداقل یک کمیت به عنوان خروجی (نتیجهٔ عملیات) تولید کند
دستورهای الگوریتم باید با زبانی دقیق و بیابهام بیان شوند. هر دستورالعمل نیز باید انجامپذیر باشد. دستورهایی نظیر «مقدار ۶ یا ۷ را به x اضافه کنید» یا «حاصل تقسیم پنج بر صفر را محاسبه کنید» مجاز نیستند؛ چرا که در مورد مثال اول، معلوم نیست که بالاخره چه عددی باید انتخاب شود و در خصوص مثال دوم هم تقسیم بر صفر در ریاضیات تعریف نشدهاست.
به عبارت دیگر برای هر ورودی باید یک پردازش صحیح تعریف شده باشد
الگوریتم باید دارای شروع و پایان مشخصی باشد، به نحوی که اگر دستورهای آن را دنبال کنیم، برای تمامی حالتها، الگوریتم پس از طی مراحل، خاتمه یابد. به علاوه، زمان لازم برای خاتمه الگوریتم هم باید به گونهای معقول و کوتاه باشد.
بهطور کلی جهت ارائهٔ یک الگوریتم کامل به ۵ مؤلفهٔ اصلی احتیاج داریم که عبارتند از:
اطلاعات اولیهای که در اختیار ما قرار میگیرد و با استفاده از آنها به ارائهٔ راه حل میپردازیم شامل مقادیر معلوم مسئله هستند و نتایجی که بر اثر انجام عملیات محاسباتی بهدست میآیند خواستههای مسئله نامیده میشوند.
از آنجایی که هدف اصلی طراحی الگوریتم برای حل یک مسئله دستیابی به خواستههای مسئله میباشد، بنابراین طی مراحل ۵ گانهٔ بالا در ارائهٔ الگوریتم الزامی است.
یک الگوریتم شامل دستورالعملهای پشت سر هم است که جهت ارائهٔ یک خروجی معتبر باید به ترتیب اجرا شوند، از این رو رعایت ترتیب در مولفههای اصلی نیز مؤثر است، چرا که اساساً بدون وجود خواستهٔ مسئله عملیات محاسباتی نیز وجود نخواهد داشت.
با بهکارگیری دستورهای شرطی میتوان خروجی و رفتار یک الگوریتم را با توجه به شرایط از پیش تعیین شدهٔ مسئله کنترل کرد، از سوی دیگر استفاده از دستورهای تکرار (حلقهها) به برنامهنویس کمک میکنند یک دستور تکراری را چندین بار اجرا کند.[4]
واژه الگوریتم اقتباسی از نام همهچیزدان ایرانی، خوارزمی است. او زادهٔ خوارزم بود که تحت خلافت عباسی قرار داشت.[5][6] رسالهای که خوارزمی در سده ۹ میلادی به زبان عربی نگاشته بود، در سده ۱۲ به لاتین با نام ترجمه شد؛ یعنی «[کتابی بدست] «الګوریتمی» در مورد اعداد هندی»، که «الګوریتمی» نام الخوارزمی بود که مترجم در تبدیل به لاتین نام وی را جلوی نام اصلی کتاب (در مورد اعداد هندی) آورده بود. در سده ۱۳ میلادی واژه الګوریسموس به معنای «سیستم شمارش عربی (دهدهی)» (یعنی اعداد ۱ تا ۹ به علاوه صفر، و نیز مفهوم اعشار) بود؛ که هنوز هم یکی از معانی واژه الګوریسم است. معنای دیگر الګوریسم «حساب کردن با کمک اعداد عربی» است؛ یعنی فن انجام اعمال حسابی پایه، مانند جمع و ضرب، با قرار دادن اعداد در زیر هم و اعمال قواعدی خاص، که جایگزین بهکارگیری اعداد رومی و استفاده از چرتکه شد. حتی روش انجام دستی تقسیم و جذر گرفتن (رادیکال) هم الګوریسم نامیده میشود. در سده ۱۹ این کلمه در فرانسوی به تغییر شکل پیدا کرد، البته معنایش ثابت ماند. طولی نکشید که این کلمه به شکل وارد زبان انگلیسی شد؛ ولی فقط در اواخر سده ۱۹ میلادی بود که معنای عامتر امروزیاش را یافت، و به «هر مجموعه قواعدی که برای انجام یک رویه محاسباتی یا روال رایانهای به کار رود» الگوریتم گفته شد.[نیازمند منبع]
تبدیل نام الخوارزمی به الگوریسم و سپس الگوریتم احتمالاً تحت تأثیر واژه یونانی (به معنای عدد) و (به معنای محاسباتی) بودهاست. برخی منابع هم کلمه لگاریتم را هم در تبدیل الگوریسم و الگوریتم بی تأثیر ندانستهاند.[7]
در علوم رایانه، یک الگوریتم را یک روال محاسباتی خوشتعریف میدانند، که مقدار یا مجموعهای از مقادیر را به عنوان ورودی (Input) دریافت کرده و پس از طی چند گام محاسباتی، ورودی را به خروجی (Output) تبدیل میکند. بجز این، الگوریتم را ابزاری برای حل مسائل محاسباتی نیز تعریف کردهاند.[8] ساخت و طراحی الگوریتم مناسب در مرکز فعالیتهای برنامهسازی رایانه قرار دارد. یک برنامه رایانهای، بیان یک یا چند الگوریتم با یک زبان برنامهنویسی است.
اولین الگوریتمهای نوشتهشده در میانرودان پیدا شدهاند. اینها فرمولهایی برای استخراج ریشهها مربوط به سال ۲۰۰۰ پ.م هستند. یعنی پیشینهٔ الگوریتمها به ۴ هزار سال پیش بازمیگردد.
در یونان باستان الگوریتمهای مختلفی کاربرد داشته است. از جمله الگوریتمی برای محاسبهٔ بزرگترین مقسوم علیه مشترک، غربال اراتستن برای یافتن اعداد اول و الگوریتم ارشمیدس برای تقریب عدد پی.
در مصر باستان نیز روش هرون برای یافتن مساحت مثلث جزو الگوریتمهای قدیمی به شمار میآید.[9]
مفهوم الگوریتم را معمولاً با تشبیه به دستور آشپزی توضیح میدهند. بهطور مثال اگر بخواهیم آبگوشت درست کنیم (عمل مورد نظر) با فرض اینکه مواد خام را داریم (حالت اولیه) مراحل مشخصی را باید طبق دستور آشپزی طی کنیم (دستورالعملها) تا به آبگوشت آماده (حالت پایانی) برسیم. البته الگوریتمها معمولاً پیچیدهتر از این هستند.
اگر الگوریتم برای عمل مورد نظر مناسب نباشد یا غلط باشد به نتیجه مورد نظر نمیرسیم؛ مثلاً اگر الگوریتم آبگوشت را با مواد اولیه کباب انجام دهیم واضح است که به آبگوشت نمیرسیم.
باید بدانیم برای هر الگوریتم تعریف متغیرها و طراحی مرحله به مرحله بسیار مهم است؛ زیرا الگوریتم باید بداند بر روی چه متغیرهایی، چه اعمالی را انجام دهد و نتیجه را در قالب چه متغیرها یا پارامترهایی نشان دهد.
معمولاً برای حل یک مسئله، روشها و الگوریتمهای گوناگونی وجود دارند؛ یک الگوریتم ممکن است عمل مورد نظر را با دستورهای مختلف در مدت زمان یا کار کمتر یا بیشتری نسبت به الگوریتم دیگر انجام دهد. به همین دلیل، انتخاب الگوریتم مناسب و کارا اهمیت زیادی در موفق بودن و کارایی برنامه رایانهای دارد. الگوریتمها به عنوان یک علم مطرح هستند[8] و دانشمندان آنها را طراحی، تحلیل، و مطالعه میکنند. مطالعه الگوریتمها زمینههای متعددی را در بر میگیرد. در زیر به چند نمونه اشاره میکنیم که میتوان آنها را چرخه حیات یک الگوریتم نامید.
الف) طراحی الگوریتمها: روشهای مختلفی برای طراحی الگوریتمها وجود دارد که عبارتند از: روشهای تقسیم و غلبه، روشهای حریصانه، روشهای برنامهنویسی پویا، روشهای پسگرد و روشهای انشعاب و تحدید.
ب) معتبر سازی یا اثبات درستی الگوریتمها: بعد از طراحی باید اثبات شود که الگوریتم مزبور درست است. الگوریتمی درست است که به ازای هر ورودی مناسب خروجی صحیحی بدهد. اثبات درستی الگوریتمها به اثبات قضایا در ریاضی میماند و مرحله بسیار مهمی در زمینه مطالعه الگوریتمها است
پ) تحلیل الگوریتمها (تحلیل مقدم، ارزیابی کارایی الگوریتمها): یک الگوریتم در زمان اجرا از واحد پردازش مرکزیِ رایانه برای اجرای دستورالعملها و از حافظه برای ذخیرهسازی برنامه و دادهها استفاده میکند. تحلیل یک الگوریتم مشخص میکند که الگوریتم در زمان اجرا برای چه مدتی از CPU برای اجرای دستورالعمل (پیچیدگی زمانی) استفاده کرده و چه مقدار از حافظه (چه اصلی و چه جانبی) برای ذخیرهسازی برنامه و دادهها (پیچیدگی فضایی) به کار بردهاست. تحلیل الگوریتم بیانگر آن است که یک الگوریتم به چه میزان پیچیدگی زمانی و پیچیدگی فضایی نیاز دارد.
ت) پیادهسازی الگوریتمها: پیادهسازی یک الگوریتم نوشتن آن به زبان برنامهنویسی خاص است که معمولاً بعد از تحلیل مقدم آن صورت میگیرد و به این پیادهسازی "برنامه" گفته میشود.
ث) تست برنامه: تست یک برنامه شامل ۱: اشکال زدایی و ۲: تحلیل مؤخر (اندازهگیری کارایی) است. اندازهگیری کارایی عبارت است از فرایند اجرای الگوریتم صحیح بر روی دادههای نمونهگیری شده برای به دست آوردن زمان و حافظهٔ مورد نیاز توسط کامپایلر. زمان اجرای یک الگوریتم به پارامترهای مختلفی بستگی دارد که از جمله میتوان به نوع دستورالعملها (دستورالعملهای جمع، ضرب، نوشتن، خواندن، شرطی و…)کامپایلر مورد استفاده، زبان برنامهنویسی، سختافزار به کار رفته و پارامتری مثل nکه میتواند معرف تعداد ورودیها و خروجیها یا هر دو باشد اشاره کرد
تحلیل الگوریتمها رشتهای است که به بررسی کارایی الگوریتمها میپردازد. تحلیل الگوریتمها یعنی پیشبینی منابع مورد نیاز برای اجرای یک الگوریتم، همچون: حافظه، پهنایباند ارتباطی، سختافزار، و از همه مهمتر، زمان.[10] کارایی یا پیچیدگی هر الگوریتم را با تابعی نشان میدهند که تعداد مراحل لازم برای اجرای الگوریتم را برحسب طول داده ورودی، یا میزان محلهای لازم حافظه را بر حسب طول داده ورودی نشان میدهد.
در بعضی کشورها، مثل آمریکا اگر تعبیه فیزیکی الگوریتمی ممکن باشد (برای مثال، یک الگوریتم ضرب که میشود آن را در واحد محاسبهٔ یک ریز پردازنده تعبیه کرد) میشود آن الگوریتم را به ثبت رساند.[نیازمند منبع]
الگوریتمشناسی علم الگوریتمها است. از موضوعات این علم میتوان به این موارد اشاره کرد:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.