پیچیدگی زمانی و Big O

تحلیل پیچیدگی زمانی با نماد Big O: O(1)، O(log n)، O(n)، O(n log n)، O(n²) و O(2ⁿ) با مثال و جدول مقایسه

چرا تحلیل پیچیدگی؟

چطور بفهمیم الگوریتمی «بهتر» است؟ زمان‌سنجی با ثانیه قابل اعتماد نیست (به سخت‌افزار بستگی دارد). راه‌حل: شمارش تعداد عملیات پایه نسبت به اندازه ورودی n — این همان نماد Big O است.

Big O چیست؟

O(f(n)) نرخ رشد زمان اجرا با بزرگ‌شدن ورودی را نشان می‌دهد. مهم‌ترین قاعده: ثابت‌ها و جمله‌های کوچک‌تر را نادیده بگیریم:

چون با n بزرگ، جمله غالب بقیه را بی‌اثر می‌کند.

پیچیدگی‌های مهم (از بهترین به بدترین)

O(1) — ثابت

مستقل از اندازه داده؛ همیشه یک عملیات. مثل دسترسی به آرایه با اندیس یا dict پایتون.

O(log n) — لگاریتمی

با هر مرحله، فضای جستجو نصف می‌شود! مثل جستجوی دودویی. برای ۱ میلیون داده فقط ~۲۰ مرحله. فوق‌العاده!

O(n) — خطی

هر عنصر را یک‌بار می‌بینیم. مثل پیمایش لیست یا جستجوی خطی.

O(n log n) — خطی‌لگاریتمی

بهترین ممکن برای مرتب‌سازی مقایسه‌ای. مثل Merge Sort و Quick Sort.

O(n²) — درجه دو

حلقه داخل حلقه روی همه داده‌ها. مثل Bubble Sort. با n=۱۰۰۰۰ یعنی ۱۰۰ میلیون عملیات!

O(2ⁿ) — نمایی

کابوس! مثل حل naive مسئله Fibonacci یا هانوی. فقط برای n کوچک قابل استفاده.

جدول مقایسه رشد

nO(1)O(log n)O(n)O(n log n)O(n²)
۱۰۱۳۱۰۳۳۱۰۰
۱۰۰۱۷۱۰۰۶۶۴۱۰٬۰۰۰
۱٬۰۰۰۱۱۰۱٬۰۰۰۹٬۹۶۶۱ میلیون
۱ میلیون۱۲۰۱M۲۰M۱ تریلیون!

به ستون O(n²) در n=۱ میلیون نگاه کنید — یک تریلیون عملیات یعنی ساعت‌ها انتظار!

قواعد محاسبه Big O

  1. ترتیبی: مجموع مراحل = بزرگ‌ترین جمله: O(n) + O(n²) = O(n²)
  2. تودرتو: حلقه در حلقه = ضرب: حلقه n تایی در حلقه n تایی = O(n²)
  3. ثابت‌ها حذف: O(2n) = O(n)
  4. ورودی‌های مستقل: دو حلقه جدا روی n و m ← O(n + m)

پیچیدگی مکانی

علاوه بر زمان، حافظه هم مهم است: آیا الگوریتم آرایه کمکی می‌سازد؟ Merge Sort حافظه اضافی O(n) می‌خواهد اما Quick Sort معمولاً O(log n).

بهترین، بدترین و میانگین

معمولاً بدترین حالت (Worst Case) گزارش می‌شود چون تضمین می‌دهد. مثلاً جستجوی خطی: بهترین ۱ مقایسه، بدترین n مقایسه ← می‌گوییم O(n).

نکته: Big O برای n بزرگ معنا دارد. برای n کوچک (مثلاً ۲۰ عنصر)، الگوریتم O(n²) ساده ممکن است از O(n log n) پیچیده سریع‌تر باشد چون سربار کمتری دارد!

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل ساختار داده و الگوریتم است.

ابزارهای مرتبط