وقتی برنامهنویسها یه الگوریتم مینویسن، فقط به درست بودنش فکر نمیکنن! یه سوال مهمتر هست: آیا این الگوریتم سریع و بهینه اجرا میشه؟ و آیا حافظه زیادی مصرف میکنه؟ تحلیل الگوریتم یعنی بررسی کنیم چقدر زمان و حافظه (فضا) برای اجرای یه الگوریتم نیازه. حالا بیا به زبون ساده زمان اجرا و فضای حافظه رو توضیح بدیم.
زمانی که یه الگوریتم برای حل یه مسئله صرف میکنه، به تعداد دستوراتی که اجرا میشه بستگی داره. هرچی تعداد این دستورات بیشتر باشه، الگوریتم بیشتر زمان میبره.
برای اینکه این مفهوم رو بهتر درک کنیم، بیا دو روش برای پیدا کردن یه عدد توی یه لیست رو مقایسه کنیم:
1️⃣ روش اول: جستجوی خطی (Linear Search)
فرض کن یه لیست داری: [2, 5, 8, 12, 16] و دنبال عدد 12 میگردی. توی جستجوی خطی باید یکییکی همهی عددها رو چک کنی تا به 12 برسی. اگه عدد آخر لیست باشه، زمان بیشتری میبره!
2️⃣ روش دوم: جستجوی دودویی (Binary Search)
این روش فقط روی لیستهای مرتب کار میکنه. اول وسط لیست رو نگاه میکنه. اگه عدد موردنظر بزرگتر یا کوچکتر باشه، نصف لیست رو حذف میکنه و دوباره جستجو میکنه. اینطوری خیلی سریعتر به نتیجه میرسه.
نتیجه: جستجوی دودویی زمان کمتری نسبت به جستجوی خطی میبره. هرچه تعداد عناصر بیشتر بشه، این اختلاف بیشتر به چشم میاد.
وقتی یه الگوریتم اجرا میشه، علاوه بر زمان، باید بررسی کنیم چقدر حافظه (RAM) مصرف میکنه. بعضی الگوریتمها به حافظهی زیادی نیاز دارن، مخصوصاً اگه بخوان دادههای زیادی رو نگه دارن.
مثال ساده:
فرض کن یه برنامه داریم که میخواد اسم 100 نفر رو نگه داره. اینجا هر اسم به فضایی توی حافظه نیاز داره. حالا اگه بهجای 100 نفر، بخوایم 1000 نفر رو ذخیره کنیم، حافظه بیشتری لازم داریم.
الگوریتمهای بازگشتی هم میتونن حافظه زیادی مصرف کنن، چون هر بار که تابع خودش رو صدا میزنه، یه بخش جدید از حافظه اشغال میشه.
در تحلیل الگوریتم از یه چیزی به اسم Big O (نماد O بزرگ) استفاده میکنیم. این نماد نشون میده که چقدر زمان یا حافظه با افزایش ورودی زیاد میشه.
چند مثال رایج از Big O:
O(1): زمان ثابت – تعداد ورودیها مهم نیست (مثل چک کردن اولین عنصر لیست).O(n): زمان خطی – زمان اجرا با تعداد ورودیها زیاد میشه (مثل جستجوی خطی).O(log n): زمان لگاریتمی – با دوبرابر شدن ورودیها، زمان اجرا کمی زیاد میشه (مثل جستجوی دودویی).O(n²): زمان درجه دوم – برای هر ورودی باید همهی ورودیهای دیگه بررسی بشن (مثل مرتبسازی حبابی).مثال:
مرتبسازی حبابی (Bubble Sort) زمان زیادی میبره (O(n²)) و برای لیستهای بزرگ ناکاره.مرتبسازی سریع (Quick Sort) با زمان O(n log n) کارآمدتر هست.تحلیل الگوریتم یعنی بررسی کنیم یه الگوریتم چقدر زمان و حافظه نیاز داره. زمان اجرا نشون میده که الگوریتم چقدر سریع به جواب میرسه و فضای حافظه نشون میده چقدر RAM مصرف میکنه. یه الگوریتم خوب هم سریع کار میکنه و هم حافظه زیادی اشغال نمیکنه. با تحلیل دقیق، میتونیم بهترین راهحلها رو پیدا کنیم و کارآمدترین برنامهها رو بنویسیم. 🚀