المستوى: للمبتدئ — مناسب لو لسه بتتعلم البرمجة وما درستش CS رسميًا، وعايز تفهم ليه نفس الـ logic أحيانًا بيشتغل في ثانيتين وأحيانًا في 4 ساعات على نفس الـ CPU.
لو function بتاعتك بتاخد ثانيتين على 1,000 سجل وبتاخد 4 ساعات على مليون، الـ CPU مش بطيء والـ SSD مش غلطان. انت كاتب algorithm من نوع O(n²)، يعني كل ما البيانات تكبر مرتين، الزمن بيكبر 4 مرات. Big O Notation هي اللغة اللي بيها بنحكم على سرعة الكود قبل ما نشغّله أصلًا، وبدونها انت بتشتري سيرفر أكبر في كل مرة بدل ما تصلح الـ algorithm.
Big O Notation للمبتدئ: ليه نفس الكود بياخد ثانيتين أو 4 ساعات
المشكلة باختصار
كل مبتدئ بيمر بنفس الموقف: الكود شغّال تمام على بيانات الـ test، ولما يتركّب على بيانات حقيقية بمليون صف، السيرفر بيتجمّد. السبب مش حجم البيانات في حد ذاته — السبب إن الـ algorithm اختياره غلط. Big O بتقولك "لو ضاعفت البيانات، الزمن هيتضاعف كام مرة" بدون ما تشغّل الكود.
مثال من الواقع: دور على اسم في دفتر التليفونات
تخيل عندك دفتر تليفونات قديم فيه 10,000 رقم، ومحتاج تلاقي رقم "أحمد محمد". قدامك طريقتين:
- الطريقة الأولى (خطّية): تفتح الدفتر من الصفحة الأولى وتقرأ كل اسم لحد ما تلاقيه. لو الاسم في النص، هتقرأ 5,000 اسم. لو في الآخر، هتقرأ 10,000.
- الطريقة التانية (binary search): الدفتر مرتّب أبجديًا. تفتح في النص. لو الاسم اللي قدامك بعد "أحمد"، تروح للنص الأول. لو قبله، للنص التاني. كل مرة بتقسم نص. هتلاقيه في 14 خطوة بس، لأن log₂(10,000) ≈ 13.3.
الطريقتين بيوصلوا لنفس النتيجة. الفرق إن الأولى O(n) والتانية O(log n). الفرق ده بيظهر بوضوح لما البيانات تكبر:
| عدد السجلات | O(n) — أسوأ عدد خطوات | O(log n) — أسوأ عدد خطوات |
|---|---|---|
| 1,000 | 1,000 | 10 |
| 1,000,000 | 1,000,000 | 20 |
| 1,000,000,000 | مليار | 30 |
التعريف العلمي بدون رياضيات معقدة
Big O بتوصف "أسوأ سيناريو ممكن للزمن أو الذاكرة لما البيانات تكبر". الرمز O(f(n)) معناه: لو حجم البيانات n، فالـ algorithm هيكمل في زمن متناسب مع f(n)، مع تجاهل الثوابت الصغيرة والـ lower-order terms.
القاعدة المبسطة: عُد عدد المرات اللي بيتم فيها زيارة العنصر الواحد. لو زيارة واحدة لكل عنصر → O(n). لو زيارة كل عنصر لكل عنصر تاني → O(n²). التعريف الرياضي الأصلي من Donald Knuth في كتابه The Art of Computer Programming (المجلد الأول، 1968)، استعارة من تدوين Bachmann الرياضي 1894.
الأنواع الستة اللي هتقابلها 95% من الوقت
- O(1) — ثابت: الزمن نفسه مهما البيانات كبرت. مثال: ، ، فتح ملف .