پیچیدگی زمانی (Time Complexity) در مقابل پیچیدگی حافظه (Space Complexity)
پیچیدگی زمانی با نماد O بزرگ نشان میدهد چقدر زمان اجرای الگوریتم با افزایش اندازه ورودی رشد میکند، در حالی که پیچیدگی حافظه نشان میدهد الگوریتم چقدر حافظه اضافی نسبت به ورودی نیاز دارد؛ بهینهسازی یکی گاهی باعث بدتر شدن دیگری میشود.
| ویژگی | پیچیدگی زمانی (Time Complexity) | پیچیدگی حافظه (Space Complexity) |
|---|---|---|
| اندازهگیری | تعداد عملیات نسبت به ورودی | حافظه اضافی نسبت به ورودی |
| نماد رایج | O(n)، O(log n)، O(n^2) | O(1)، O(n)، O(n^2) |
| اهمیت بیشتر در | سیستمهای Real-time | دستگاههای با حافظه محدود |
کِی از پیچیدگی زمانی (Time Complexity) استفاده کنیم؟
وقتی سرعت اجرا حیاتی است، مثلاً در سیستمهای Real-time یا پردازش حجم بالای درخواست همزمان.
کِی از پیچیدگی حافظه (Space Complexity) استفاده کنیم؟
وقتی حافظه محدود است، مثلاً در دستگاههای embedded یا وقتی دادههای بسیار بزرگ نمیتوانند کامل در RAM بارگذاری شوند.
مثال پیچیدگی زمانی (Time Complexity)
// O(n) زمان، O(n) حافظه: استفاده از HashSet
// برای پیدا کردن تکراریها با یک بار پیمایش
var seen = new HashSet<int>();
foreach (var x in arr)
if (!seen.Add(x)) return true;
مثال پیچیدگی حافظه (Space Complexity)
// O(n^2) زمان، O(1) حافظه: مقایسه دوبهدو
// بدون ساختار داده اضافی
for (int i = 0; i < arr.Length; i++)
for (int j = i + 1; j < arr.Length; j++)
if (arr[i] == arr[j]) return true;
اشتباه رایج
اشتباه رایج این است که فقط دنبال سریعترین الگوریتم (کمترین زمان) باشیم بدون توجه به اینکه ممکن است حافظه زیادی مصرف کند و در محیط با منابع محدود اصلاً قابل اجرا نباشد.
جمعبندی
انتخاب بین بهینهسازی زمان یا حافظه باید بر اساس محدودیت واقعی سیستم (CPU در برابر RAM) باشد، نه صرفاً دنبال کردن کمترین O بزرگ زمانی.
