CodeShot

پیچیدگی زمانی (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 بزرگ زمانی.