المستوى: مبتدئ
لو كودك بيرد في 30ms على 500 صف وبقى ياخد 8 ثواني بعد ما البيانات وصلت 50 ألف، المشكلة مش السيرفر ومش لغة البرمجة. المشكلة في حاجة اسمها Big O — وهي السبب اللي بيخلي مبرمج يكتب نفس الميزة في 6 سطور بترد فوريًا، وآخر يكتبها في 60 سطر تعلّق التطبيق.
Big O Notation: ازاي تتنبأ بسرعة كودك قبل ما البيانات تكبر
المشكلة باختصار
كل مبرمج بيختبر كوده على بيانات صغيرة. السكربت بيشتغل، الـ endpoint بيرد سريع، التيستات بتعدي. بعد 6 شهور في الإنتاج، نفس الكود بقى يعلّق على بيانات أكبر بـ 100 ضعف. الفرق بين كود بيفضل سريع وكود بينهار هو فهم Big O.
مثال للمبتدئ: دور على رقم في دفتر تليفون
تخيل عندك دفتر تليفون فيه 10 آلاف اسم، وعايز تلاقي رقم "محمد عبدالله".
- الطريقة الأولى: تقلب صفحة صفحة من البداية لحد ما تلاقيه. لو الاسم في الآخر، هتقلّب 10 آلاف صفحة. لو الدفتر كبر لـ 100 ألف، هتقلّب 100 ألف. الزمن بيكبر بنفس نسبة البيانات. ده اسمه O(n).
- الطريقة التانية: تفتح الدفتر في النص، تبص للحرف، لو "م" قبل الحرف اللي قدامك، تشطب نص الدفتر التحت. لو بعده، تشطب نص الدفتر الفوق. كل مرة بتشطب النصف. 10 آلاف اسم بتلاقيهم في 14 محاولة بس. 100 ألف في 17 محاولة. ده اسمه O(log n).
دي بالظبط فلسفة Big O: مش بنقيس سرعة الكود في الثواني، بنقيس ازاي السرعة بتتأثر لما البيانات تكبر.
التعريف العلمي الدقيق
Big O Notation أداة رياضية بتوصف الحد الأعلى لمعدل نمو دالة. في علوم الحاسب، بنستخدمها لوصف زمن التشغيل (أو استهلاك الذاكرة) لخوارزمية بدلالة حجم الإدخال n. الترميز O(f(n)) معناه أن زمن التنفيذ بيكبر بمعدل لا يتجاوز ثابت مضروب في f(n) عندما n يقترب من ما لا نهاية. الثوابت الصغيرة بتُهمَل لأن أثرها بيتلاشى مع كبر n.
الأنواع الشائعة، مرتبة من الأسرع للأبطأ:
- O(1) — زمن ثابت لا يتغير. مثال:
arr[5]في أي Array. على 10 عناصر = 0.1 ميكروثانية. على 10 مليون عنصر = 0.1 ميكروثانية برضه. - O(log n) — لوغاريتمي، نمو بطيء جدًا. مثال: Binary Search في List مرتّبة. على مليون عنصر = 20 خطوة فقط.
- O(n) — خطي. مثال: حلقة
forواحدة بتمر على كل عنصر. على مليون عنصر = مليون خطوة. - O(n log n) — مثال: Merge Sort وQuick Sort. على مليون عنصر = حوالي 20 مليون خطوة.
- O(n²) — تربيعي. مثال: حلقتين متداخلتين على نفس البيانات. على مليون عنصر = تريليون خطوة. ساعات على CPU عادي.
- O(2ⁿ) — أُسي، خطير. مثال: Fibonacci recursive بدون memoization. على 50 مدخل بس = أيام.
مثال كود حقيقي: لقّيلي رقم مكرّر
المهمة بسيطة: عندك List فيها أرقام، رجّعلي True لو فيه رقم مكرر، لو لأ.