هذا المقال يتطلب مستوى مبتدئ
لو كتبت دالة بحث بتشتغل بسرعة على 100 عنصر، وفجأة بتاخد 10 ثواني لما العدد يبقى 10,000، المشكلة مش في السيرفر ولا في اللغة. المشكلة في "شكل النمو" بتاع الكود نفسه. Big O Notation هي اللغة اللي بتقولك ده قبل ما تكتشفه على الإنتاج.
Big O Notation: قياس الكود قبل ما يكسر
المشكلة باختصار
كتير من المطورين بيقيسوا الأداء بمعادلة "اشتغل ولا لأ". المعادلة دي بتنفع وانت لسه شغّال على 50 سجل في local DB. لما العدد يطلع 50 ألف، الكود اللي كان "شغّال" بيبقى الـ bottleneck الأول في الـ pipeline. Big O بترد على سؤال مختلف: لو حجم المدخل كبر 10 مرات، الزمن هيكبر كام مرة؟
ابدأ بمثال يومي قبل أي كلام تقني
تخيّل إنك بتدوّر على اسم في دفتر تليفونات ورقي فيه 1000 رقم.
- الطريقة الأولى: بتفتح صفحة صفحة من الأول للآخر لحد ما تلاقي الاسم. لو الاسم في آخر صفحة، انت قريت 1000 صفحة.
- الطريقة الثانية: بتفتح في النص، بتشوف الاسم اللي بتدوّر عليه قبل ولا بعد الصفحة دي أبجدياً، بتاخد النص اللي فيه الاسم، وبتفضل تنصّف. في الحالة دي مش هتقرا أكتر من 10 صفحات تقريباً.
الطريقة الأولى بتسمى O(n)، والثانية بتسمى O(log n). الفرق مش "أسرع شوية" — الفرق إن لو الدفتر بقى مليون رقم، الطريقة الأولى هتاخد مليون خطوة، والثانية حوالي 20 خطوة فقط.
التعريف العلمي بعد ما المثال وصل
Big O Notation هي صيغة رياضية بتوصف الحد الأقصى لنمو عدد العمليات اللي بيعملها الكود مع كبر حجم المدخلات. الـ "n" بتعني حجم المدخل، والصيغة بتركّز على المعامل الأهم في معادلة النمو، وبتتجاهل الثوابت والمعاملات الأقل تأثيراً.
يعني لو دالة بتعمل 3n² + 5n + 100 عملية، Big O بتاعتها O(n²)، لأن n² هو اللي بيتحكم في النمو لما n تكبر.
أنواع التعقيد الشائعة بترتيب السرعة
اللي فوق أسرع. اللي تحت بيقتل الإنتاج.
- O(1) — Constant Time: الكود بياخد نفس الوقت بغض النظر عن حجم المدخل. مثال: قراءة عنصر من Array بالـ index، أو فحص قيمة في HashMap.
- O(log n) — Logarithmic: بينصّف المشكلة كل تكرار. Binary search على مصفوفة مرتبة، أو البحث في Binary Tree متوازن.
- O(n) — Linear: بيعدّي على كل عنصر مرة واحدة. مثال:
Array.indexOf()أو حساب مجموع عناصر. - O(n log n): أسرع خوارزميات الترتيب الشائعة (Merge Sort, Quick Sort في المتوسط).
- O(n²) — Quadratic: نسيت
forجواforعلى نفس البيانات. على 10K عنصر، ده 100 مليون عملية. - O(2ⁿ) — Exponential: كل عنصر زيادة بيضاعف الزمن. حلول recursion لـ Fibonacci بدون memoization بتقع هنا.