The mathematical notation used to describe the performance and efficiency of algorithms as input size grows.
What is Big O Notation?
لما بتكتب كود، السؤال المهم مش بس "هل الكود بيشتغل؟"
السؤال الأهم: "قد إيه الكود سريع؟ وبيستهلك ذاكرة
إزاي؟"
Big O Notation هو طريقة رياضية لوصف:
كام عملية (operation) الكود بيعملها؟
قد إيه ذاكرة الكود بيستهلك؟
الحرف n بيمثل حجم المدخلات (Input Size).
Big O بيركز على أسوأ حالة (Worst Case) - يعني لو الحظ وحش، الكود هياخد قد إيه؟
فيه كمان Best Case (أحسن حالة) و Average Case (المتوسط)، بس غالباً بنهتم بالـ Worst.
Common Complexity Classes - مرتبة من الأسرع للأبطأ
الوقت ثابت - مش مهم حجم الـ input!
📖 تشبيه:
زي إنك تفتح كتاب على صفحة معينة - مش مهم الكتاب فيه كام صفحة.
كل ما الـ n يتضاعف، الوقت بيزيد خطوة واحدة بس!
📖 تشبيه:
زي البحث في القاموس - بتقسم النص كل مرة.
الوقت يزيد بنفس نسبة زيادة الـ input.
📖 تشبيه:
زي قراءة كتاب صفحة صفحة - كتاب أكبر = وقت أكتر.
أحسن ما يمكن لـ خوارزميات الترتيب المبنية على المقارنة.
📖 تشبيه:
زي ترتيب ورق الكوتشينة بطريقة ذكية.
الوقت بيزيد بمربع حجم الـ input!
⚠️ تحذير:
n = 1000 → مليون عملية!
أمثلة: Bubble Sort, Selection Sort
الوقت بيتضاعف مع كل إضافة للـ input!
⚠️ خطر:
n = 30 → أكتر من مليار عملية!
Visualize Growth Rates
💡 لاحظ: كل ما n بيزيد، الفرق بين الخوارزميات السريعة والبطيئة بيبقى ضخم جداً!
Real-World Examples
function getFirst(arr) {
return arr[0]; // Always ONE operation
}
// Whether arr has 10 or 10,000,000 elements
// This takes the SAME time!
الشرح: الوصول لعنصر في array بالـ index بياخد نفس الوقت سواء الـ array فيها 10 عناصر أو 10 مليون!
السبب: الـ array بتخزن العناصر في ذاكرة متتالية، فالكمبيوتر بيحسب العنوان مباشرة.
function findMax(arr) {
let max = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
الشرح: لازم نعدي على كل عنصر عشان نلاقي الأكبر.
لو الـ array فيها n عنصر، هنعمل n مقارنة.
الوقت بيزيد خطياً مع حجم الـ input.
function hasDuplicate(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
return true;
}
}
}
return false;
}
الشرح: Loop جوه loop! كل عنصر بيتقارن بكل العناصر التانية.
n = 100 → ~5,000 مقارنة
n = 1,000 → ~500,000 مقارنة!
💡 ممكن نحسنها لـ O(n) باستخدام Set أو Hash!
| Complexity | Name | n = 1000 | Examples |
|---|---|---|---|
| O(1) | Constant | 1 | Array access, Hash lookup |
| O(log n) | Logarithmic | ~10 | Binary Search |
| O(n) | Linear | 1,000 | Linear Search, Single loop |
| O(n log n) | Linearithmic | ~10,000 | Merge Sort, Quick Sort |
| O(n²) | Quadratic | 1,000,000 | Bubble Sort, Nested loops |
| O(2ⁿ) | Exponential | ∞ | Fibonacci (naive), Subsets |