تذکر: این یک پست آموزشی برای عموم نیست! بلکه تنها جایی برای یادداشتهای من حین یادگیریه تا بهتر به خاطر بسپارم و در صورت لزوم به اونها مراجعه کنم.
یک الگوریتم، در واقع راه حلی برای برطرف کردن یک مشکل یا برآوردهسازی یک نیاز خاصه، هر آدمی ممکنه یک مشکل یا یک نیاز خاص رو به روش خودش حل کنه، پس ممکنه به ازاری یک مشکل یا نیاز چندین الگوریتم داشته باشیم. یک برنامهٔ نرمافزاری برای حل مشکل/برآوردهسازی نیاز ممکنه از یک یا مجموعهای از الگوریتمها استفاده کنه، بعضی از این الگوریتمها عمومیت دارن و بهطور گسترده و به شکل استاندارد پیادهسازی و در قالب کدهای کتابخانهای استاندارد همراه با زبانهای مختلف ارائه میشن، اما قطعا در یک برنامهٔ حرفهای برنامهنویس مجبوره که الگوریتمهای خاصی رو توسعه بده که قطعا در این میان از اون الگوریتمهای استاندارد (مثل مرتبسازی، محاسباتی و...) استفاده میکنه. در واقع این الگوریتم یا روش حل مساله هست که به یک برنامه موجودیت و قدرت میده.
توسعه نرمافزار بدون دانش الگوریتم و دیتا استراکچر، مثل ساخت یک ماشین بدون دونستن نحوهٔ عملکرد موتوره.
ویژگیهای هر الگوریتم:
۱. پیچیدگی الگوریتم
الف) پیچیدگی فضایی: میزان حافظهٔ مورد نیاز
ب) پیچیدگی زمانی: میزان زمان مورد نیاز برای کامل شدن
۲. ورودی و خروجیها
الف) الگوریتم چه چیزهایی را دریافت و در عوض چه چیزی را به عنوان خروجی برمیگرداند؟ مثلا یک عدد میگیره و با اعمال یک پروسه و تستهای خاص می گه که این عدد اول/زوج و... هست یا خیر.
۳. دستهبندی الگوریتمها:
سریال (Serial)/موازی (Parallel)، دقیق (Exact)/تقریبی (Approximate)، قطعی (Deterministic) و غیر قطعی (Non-Deterministic).
الگوریتمهای معمول:
منظور الگوریتمهای عمومی و با کاربرد فراوون هستن که احتمالا حین توسعهٔ هر نرمافزاری باهاشون برخورد داریم و معمولا در قالب کتابخانههای استاندارد پیادهسازی میشن و به صورت یک پکیج همراه با هر زبان برنامهنویسی خاصی نصب میشن یا اصولا به شکل built-in درون خودشون دارنش.
۱. الگوریتمهای جستجو:
پیدا کردن یک دیتای خاص توی یک ساختار (برای مثال، یک زیر رشته از یک رشته بزرگتر)، مثل تابع substr توی php
۲. الگوریتمهای مرتبسازی:
یک مجموعه دیتا دریافت میکنند و با یک ترتیب خاص، به اون دادهها نظم میدن مثل sort توی php
۳. الگوریتمهای محاسباتی:
یک مجموعه دیتا دریافت میکنند و یک سری محاسبات روی اونها انجام میدن.
مثلا یک لیست از اعداد میدیم به یک تابع تا برای ما برآورد کنه که کدوم اعداد اول، زوج و... هستن.
۴. الگوریتمهای مجموعهای (collection algorithms) - نمیدونم دقیقا توی فارسی چی باید بهش گفت:
کار با مجموعه ای از دادهها (شمارش آیتمهای خاص، جابهجا شدن بین عناصر داده، فیلتر کردن داده های ناخواسته و...)
پیادهسازی الگوریتم اقلدیس برای پیدا کردن بزرگترین مقسومعلیه مشترک:
Euclid's Algorithm for find the greatest common denominator (GCD) of two ints:
البته ظاهرا بهش Greatest common divisor هم گفته میشه.
تعریف بزرگترین مقسوم علیه مشترک چیه؟ بزرگترین عدد مشترک بین دو تا عدد صحیح که باقیماندهٔ تقسیم این اعداد برش برابر با صفر بشه، مثلا GCD برای اعداد ۲۰ و ۸ برابر ۴ هست.
الگوریتم ما چی میشه؟
۳. در غیر این صورت، a رو به b و b رو به r نسبت میدیم و دوباره این پروسه رو تکرار میکنیم تا جایی که r برابر با صفر بشه.

پیادهسازی این الگوریتم با پایتون:
