اگر در حوزه برنامه نویسی فعالیت داشته باشید، مطمئناً نام الگوریتم به گوش تان خورده است. در دنیای تکونولوژی، الگوریتمها نقش بسیار حیاتی ایفا میکنند. آنها به عنوان دستورالعملهای محاسباتی، ما را در حل مسائل مختلف هدایت میکنند. از بهینهسازیهای مهندسی نرمافزار تا مسائل پیچیدهی هوش مصنوعی. الگوریتمها اساسیترین ستون پشتیبان در زمینهی محاسبات هستند. اینکه شما بدانید چه الگوریتم های خوب هست و در چه موقعیت های باید از کدام استفاده کرد به شما کمک میکند برنامه های با کیفیت و پرسرعت توسعه بدهید.
الگوریتم چیست؟
الگوریتم به یک دسته محدود و مشخص از دستورالعمل هایی می گویند که با ترتیب خاصی انجام می شوند و یک مسئله خاص را برای ما حل می کنند. واژه الگوریتم از نام لاتین، «ابوجعفر محمد بن موسی خوارزمی»، ریاضی دان مشهور ایرانی گرفته شده است. الگوریتم یک مبحث جدید و مختصر به دنیای برنامه نویسی نیست؛ بلکه از قدیم وجود داشته است. دانشمندان از قدیم به دنبال توسعه الگوریتم های سریع و کارآمد برای محاسبات بودند. یکی از قدیمیترین الگوریتمهای شناخته شده، الگوریتم اقتسام و حاصلضرب است که از دوران بابلیها و سومریها به کار میرفته است.
ویژگی الگوریتم ها
- هر الگوریتم می تواند هیچ ورودی یا حداقل یک ورودی داشته باشد در صورت داشتن ورودی باید ورودی به طور دقیق و بدون ابهام مشخص باشد
- هر الگوریتم باید یک خروجی داشته باشد و خروجی باید به طور دقیق و بدون ابهام مشخص باشد
- مراحل الگوریتم باید خوانا،دقیق،ومختصر باشند و هر کدام یک کار مشخص را انجام دهند
- الگوریتم باید به درستی مسئله را حل و برای همه شرایط مسئله راه حل داشته باشد
- هر الگوریتم باید شروع و پایین مشخصی داشته باشد و بی انتها نباشد
نمونه ای از الگوریتم برای جمع دو عدد
.شروع
. متغیرهای با نام num1, num2, sum تعریف کن
. عدد های num1, num2 را بخوان
. عدد num1 را به num2 اضافه کن و نتیجه را در sum ذخیره کن
. متغیر sum را در خروجی نشان بده
. پایان
همان طور که می بینید پایان و شروع الگوریتم مشخص هست و هر مرحله تعریف شده و بدون ابهام هست
چرا الگوریتم ها اهمیت فراونی در برنامه نویسی دارند ؟
کامپیوترها به عنوان ماشینهای محاسباتی عمل میکنند و مغز ندارند. آنها دستورات را به عنوان یک مجموعه مراحل مشخص و دقیق دریافت میکنند. به عبارت دیگر، برای ارتباط با یک کامپیوتر، ما باید به دقت تعیین کنیم که چه کاری را از آن میخواهیم. مثلاً، اگر بخواهیم یک مجموعه اعداد را به ترتیب صعودی مرتب کنیم، باید به کامپیوتر توضیح دهیم که ترتیب صعودی چگونه انجام میشود، چگونه اعداد را مقایسه کند و غیره. به این فرایند ترجمه عبارات معمولی به زبانی قابل فهم برای کامپیوتر، برنامهنویسی می گویند
اما برنامهنویسی کامپیوتر به معنای ترجمه عبارات ساده به زبان کامپیوتری نیست. در برخی موارد، ما نیاز داریم که راهحلهای جدیدی بسازیم و این تنها به معنای ترجمه نیست. بلکه به این معناست که چگونه مسئله را به نحوی کاملاً جدید تفسیر کنیم و به کامپیوتر بگوییم چگونه این مسئله را حل کند. در اینجا، نیاز به الگوریتمهایی داریم که مسائل را به شکل صحیح و کارآمدی حل کنند.
اهمیت انتخاب الگوریتم به ویژه در مقیاسهای بزرگ ظاهر میشود. در مقایسههای کوچک، انتخاب الگوریتم تأثیر چندانی ندارد و تفاوت زمان اجرا کمتر به چشم میآید. اما وقتی با مقیاسهای بزرگی سر و کار داریم، انتخاب یک الگوریتم کارآمد و سریع بسیار حائز اهمیت میشود. به عنوان مثال، اگر شما بخواهید یک میلیون عدد را مرتب کنید، نیاز دارید که از یک الگوریتم استفاده کنید که به سرعت و با کارآیی بالا این کار را انجام دهد.
انواع الگوریتم ها
- الگوریتم بازگشتی (Recursive Algorithm):
الگوریتم بازگشتی بر مبنای بازگشت ساخته شدهاند. مسئله به زیرمسائل کوچکتر تقسیم میشود و برای حل هر زیرمسئله از همان الگوریتم استفاده میشود.
- الگوریتم حریصانه (Greedy Algorithm):
در الگوریتم حریصانه، در هر مرحله بهترین انتخاب ممکن بر اساس یک معیار مشخص انجام میشود..
- الگوریتمهای پسگرد (Backtracking Algorithms):
الگوریتمهای پسگرد مسئله را با انجام تلاشهای متوالی و تست شرایط مختلف حل میکنند. اگر تستها نتیجهٔ موفق داشته باشند، حل قطعی به دست میآید.
- الگوریتم تقسیم و حل (Divide and Conquer Algorithm):
الگوریتمها تقسیم و حل مسئله را به زیرمسائل کوچکتر تقسیم میکنند، هر زیرمسئله را حل میکنند و سپس نتایج را ترکیب میکنند تا به یک حل کلی برسند.
- الگوریتم برنامهنویسی پویا (Dynamic Programming Algorithm):
لگوریتم برنامهنویسی پویا از حل زیرمسائل متفاوت استفاده میکنند و نتایج آنها را ذخیره کرده و باز استفاده میکنند تا به حل مسئلهٔ اصلی برسند.
این الگوریتمها بسته به نوع مسئله و نوع دادههایی که با آنها سروکار دارند، انتخاب میشوند و برای هر کدام از آنها مراحل مشخصی وجود دارد که باید دنبال شود.
تحلیل و بررسی الگوریتم ها و تخمین زمان اجرا
هدف از تحلیل الگوریتم، پیشبینی عملکرد الگوریتم به ویژه زمان اجرا است. برای دانشمندان علوم کامپیوتر، داشتن یک معیار ساده برای تخمین زمان اجرای الگوریتم بسیار مفید است. این معیار به آنها کمک میکند تا بتوانند به سادگی رفتار الگوریتم در شرایط مختلف را تخمین بزنند، بدون اینکه هر بار الگوریتم را اجرا کنند و زمان اجرا را اندازهگیری کنند. همچنین، اگر تغییراتی در الگوریتم اعمال شود، میتوان به سرعت تاثیر این تغییرات را بر زمان اجرا تخمین زد..
متأسفانه، تخمین دقیق زمان اجرای الگوریتم وابسته به شرایط متعددی است، از جمله نوع سختافزار کامپیوتر، نوع زبان برنامهنویسی، و غیره. به همین دلیل، زمان اجرای الگوریتم به صورت تقریبی بر اساس مراحل کلیدی الگوریتم تخمین زده میشود. اما همین تخمین تقریبی هم اطلاعات زیادی را به ما می دهد و ما با استفاده از این اطلاعات می توانیم چند الگوریتم را با یکدیگر مقایسه کنید
دانشمندان علوم کامپیوتر برای تخمین زمان اجرای الگوریتم از BIG O NOTION استفاده می کنند به این صورت که بر اساس ورودی و مراحل مهم الگوریتم آن در یک پرانتز با حرف O به این شکل O(n) نشان می دهند که در اینجا n همان مقدار ورودی هست.
on الگوریتم و اهمیت آن در برنامه نویسی