- بواسطة x32x01 ||
إزاي تفهم الـ Time و الـ Space Complexity بأسهل شكل ممكن؟ 
بص بقى…
لو إنت بدأت برمجة أو حتى شغال بقالك فترة، أكيد صادفت مصطلحات زي:
وفي الغالب حسّيت إن الموضوع كبير كده أو نظري ومعقد
بس الصراحة… الموضوع أسهل بكتير جدًا من اللي بيتقال.
تعالى نفهمهم ببساطة ومن غير تعقيد
يعني إيه Time Complexity؟
Time Complexity ببساطة هو مقياس بيقول لنا:
الكود ده بياخد وقت قد إيه لما حجم البيانات يكبر؟
يعني لو انت كتبت كود يشتغل على Array فيها 10 عناصر
هل لو الـ Array بقت 100؟ 1000؟ مليون؟
الوقت هيفرق قد إيه؟
بدل ما نقعد نقيس الثواني والميلي ثانية اللي بتختلف من جهاز لجهاز
إحنا بنستخدم مقياس ثابت اسمه Big O Notation.
أشهر قيم الـ Big O اللي هتقابلها دايمًا
تعالى نشوف أمثلة
هنا الوصول للعنصر بياخد نفس الوقت مهما كان حجم الـ Array.
مثال O
هنا الوقت بيعتمد على عدد العناصر.
لو 4 عناصر يطبع 4
لو 1000 هيمر على 1000 عنصر
وده اللي بنسميه Linear Time.
حلقة جوا حلقة = الكود بيتضاعف مع كل عنصر
وده أكتر حاجة بتبطّل الأداء…
وده اللي بنحاول نتجنبه دايمًا
طب دلوقتي يعني نعمل إيه؟
الهدف إنك تحاول دايمًا تبعد عن الأكواد اللي الـ Complexity بتاعها عالي
خصوصًا O(n²) و O(n³).
كل ما كان الكود أسرع في التعامل مع البيانات الكبيرة = أداء أحسن = مشروع محترم

نيجي بقى لـ Space Complexity
زي ما بنسأل:
الكود بياخد وقت قد إيه؟
بنفس الشكل بنسأل:
الكود بياخد ذاكرة (RAM) قد إيه؟
ده بقى اللي بنسميه Space Complexity.
ليه الموضوع ده مهم؟
تخيل إن الكود سريع جدًا (Time كويس)،
لكنه محتاج ذاكرة 8 جيجا عشان يشتغل
طب لو الجهاز اللي عليه 4 جيجا؟
الكود مش هيشتغل أصلاً
فلازم نعمل توازن بين السرعة والذاكرة.
أنواع Space Complexity الشائعة
هنا بنستخدم بس متغير واحد → ذاكرة ثابتة.
مثال O
هنا الذاكرة بتزيد على قد حجم البيانات.
طيب إزاي نختار الأفضل؟
دايمًا الموضوع عبارة عن Trade-off:
مثال مهم جدًا يقرب الموضوع
عندك Array من أرقام وعايز تجيب أكبر قيمة.
تشبيه بسيط يلمّ الموضوع كله
تخيل إنك سايق عربية:
لو فضلت تجري بسرعة جدًا → هتستهلك بنزين بسرعة
ولو وفرت بنزين على الآخر → مش هتوصل بدري
الحل؟
تسوق بعقل
توازن بين الاتنين.
الخلاصة
ولو فهمت الاتنين دول كويس…
إنت كده محطوط على أول خطوة صح إنك تبقى مبرمج قوي

بص بقى…
لو إنت بدأت برمجة أو حتى شغال بقالك فترة، أكيد صادفت مصطلحات زي:
- Time Complexity
- Space Complexity
- Big O Notation
وفي الغالب حسّيت إن الموضوع كبير كده أو نظري ومعقد
بس الصراحة… الموضوع أسهل بكتير جدًا من اللي بيتقال.
تعالى نفهمهم ببساطة ومن غير تعقيد
يعني إيه Time Complexity؟
Time Complexity ببساطة هو مقياس بيقول لنا:الكود ده بياخد وقت قد إيه لما حجم البيانات يكبر؟
يعني لو انت كتبت كود يشتغل على Array فيها 10 عناصر
هل لو الـ Array بقت 100؟ 1000؟ مليون؟
الوقت هيفرق قد إيه؟
بدل ما نقعد نقيس الثواني والميلي ثانية اللي بتختلف من جهاز لجهاز
إحنا بنستخدم مقياس ثابت اسمه Big O Notation.
أشهر قيم الـ Big O اللي هتقابلها دايمًا
| الرمز | المعنى | المثال |
|---|---|---|
| O(1) | وقت ثابت | قراءة عنصر من Array بالمؤشر |
| O | الوقت بيزيد خطيًا | حلقة for بتمر على كل عنصر |
| O(n²) | الوقت بيزيد أسرع جدًا | حلقة جوا حلقة |
| O(log n) | وقت سريع جدًا نسبيًا | Binary Search |
تعالى نشوف أمثلة
مثال O(1)
Python:
arr = [10, 20, 30, 40]
print(arr[2]) # الوصول مباشرة للعنصر رقم 2 مثال O
Python:
arr = [5, 9, 2, 7]
for x in arr:
print(x) لو 4 عناصر يطبع 4
لو 1000 هيمر على 1000 عنصر
وده اللي بنسميه Linear Time.
مثال O(n²)
Python:
arr = [1, 2, 3]
for i in arr:
for j in arr:
print(i, j) وده أكتر حاجة بتبطّل الأداء…
وده اللي بنحاول نتجنبه دايمًا
طب دلوقتي يعني نعمل إيه؟
الهدف إنك تحاول دايمًا تبعد عن الأكواد اللي الـ Complexity بتاعها عاليخصوصًا O(n²) و O(n³).
كل ما كان الكود أسرع في التعامل مع البيانات الكبيرة = أداء أحسن = مشروع محترم
نيجي بقى لـ Space Complexity
زي ما بنسأل:الكود بياخد وقت قد إيه؟
بنفس الشكل بنسأل:
الكود بياخد ذاكرة (RAM) قد إيه؟
ده بقى اللي بنسميه Space Complexity.
ليه الموضوع ده مهم؟
تخيل إن الكود سريع جدًا (Time كويس)،لكنه محتاج ذاكرة 8 جيجا عشان يشتغل
طب لو الجهاز اللي عليه 4 جيجا؟
الكود مش هيشتغل أصلاً
فلازم نعمل توازن بين السرعة والذاكرة.
أنواع Space Complexity الشائعة
| الرمز | المعنى | المثال |
|---|---|---|
| O(1) | الكود بياخد نفس الذاكرة مهما كبر الحجم | متغير واحد فقط |
| O | الذاكرة بتزيد على قد حجم البيانات | Array أو List جديدة بنفس الحجم |
| O(n²) | لما تعمل Arrays داخل Arrays | Matrix أو جدول بيانات ضخم |
مثال O(1)
Python:
def print_first(arr):
print(arr[0]) مثال O
Python:
arr = [1, 2, 3, 4]
copy_arr = arr[:] # عمل نسخة اخرى طيب إزاي نختار الأفضل؟
دايمًا الموضوع عبارة عن Trade-off:- لو ركزت على السرعة قوي → ممكن تستهلك RAM كبيرة.
- لو ركزت تقلل الذاكرة → ممكن السرعة تقل.
مثال مهم جدًا يقرب الموضوع
عندك Array من أرقام وعايز تجيب أكبر قيمة.الطريقة الأولى:
تمر على العناصر واحد واحد. Python:
max_value = arr[0]
for x in arr:
if x > max_value:
max_value = x - Time → O
- Space → O(1)
سريع
بياخد قليل ذاكرة
ممتاز جدًا.
الطريقة الثانية:
تعمل Sort للأرقام وتاخد آخر عنصر. Python:
arr.sort()
print(arr[-1]) - Time → O(n log n) (البحث أسرع؟ لأ، الترتيب أبطأ)
- Space → ممكن O
لو الـ Sort بيعمل نسخة داخلية
أبطأ
بياخد ذاكرة أكتر
تشبيه بسيط يلمّ الموضوع كله
تخيل إنك سايق عربية:- Time Complexity = عداد السرعة
- Space Complexity = عداد البنزين
لو فضلت تجري بسرعة جدًا → هتستهلك بنزين بسرعة
ولو وفرت بنزين على الآخر → مش هتوصل بدري
الحل؟
تسوق بعقل
توازن بين الاتنين.
الخلاصة
- Time Complexity بيقولك الكود بياخد وقت قد إيه لما البيانات تكبر.
- Space Complexity بيقولك الكود بيستهلك ذاكرة قد إيه.
- الهدف دايمًا = أسرع أداء بأقل ذاكرة ممكنة.
ولو فهمت الاتنين دول كويس…
إنت كده محطوط على أول خطوة صح إنك تبقى مبرمج قوي