ما معنى Complexity في الخوارزميات وهياكل البيانات؟ شرح مبسّط لتعقيد الوقت والذاكرة
«التعقيد» (Complexity) في الخوارزميات هو ببساطة مقياس يخبرك بمدى نمو الوقت الذي تستغرقه الخوارزمية أو حجم الذاكرة التي تستهلكها كلما كبُر حجم البيانات التي تعالجها. أي أنه لا يقيس عدد الثواني على جهازك تحديدًا، بل يصف سلوك الخوارزمية عندما ينتقل عدد المدخلات من مئة عنصر إلى مليون. لهذا نكتبه بصيغة رياضية مثل O(n) أو O(log n)، وهي الطريقة القياسية لمقارنة الخوارزميات بغضّ النظر عن قوة الجهاز أو لغة البرمجة.
الفكرة المحورية التي يخطئ فيها كثيرون: التعقيد لا يقول لك «هذه الخوارزمية أسرع»، بل يقول «هذه الخوارزمية تتوسّع بشكل أفضل مع كبر البيانات». وهذان أمران مختلفان، وسنوضح الفرق في نهاية المقال.
نوعان من التعقيد: الزمني والمكاني
هناك بُعدان نقيس عليهما أي خوارزمية:
- التعقيد الزمني (Time Complexity): كم تزداد عدد العمليات (الخطوات الحسابية) كلما زاد حجم المدخلات n. هو الأكثر استخدامًا لأن السرعة عادةً هي همّنا الأول.
- التعقيد المكاني (Space Complexity): كم تحتاج الخوارزمية من ذاكرة إضافية أثناء عملها، بخلاف مساحة المدخلات نفسها. تظهر أهميته بوضوح في الأجهزة محدودة الموارد كالهواتف وأنظمة إنترنت الأشياء.
غالبًا يوجد مقايضة بينهما: قد تسرّع خوارزمية بتخزين نتائج وسيطة في الذاكرة (مثل أسلوب التخزين المؤقت Memoization)، فتربح في الوقت وتخسر في المساحة، والعكس صحيح.
ما معنى نوتة O الكبيرة (Big O)؟
نوتة O الكبيرة تصف الحد الأعلى لنمو الخوارزمية في أسوأ الحالات. عند حسابها نتجاهل التفاصيل الثابتة ونركّز على العامل المسيطر عندما تكبر n:
- نُهمل الثوابت: نكتب O(n) وليس O(2n) أو O(n + 5)، لأن الثابت لا يغيّر شكل النمو.
- نبقي على الحدّ الأعلى فقط: خوارزمية تعقيدها O(n² + n) نختصرها إلى O(n²) لأن n² هو من يسيطر عند الأرقام الكبيرة.
بهذه البساطة نحصل على «بصمة» موحّدة تسمح بمقارنة عادلة بين الحلول المختلفة.
رتب التعقيد من الأسرع إلى الأبطأ
الجدول التالي يرتّب أشهر رتب التعقيد الزمني مع مثال شائع لكل منها، ومعنى النمو عمليًا:
| الرتبة | الاسم | مثال نموذجي | كيف تنمو؟ |
|---|---|---|---|
| O(1) | ثابت | الوصول لعنصر في مصفوفة عبر مؤشره | لا تتأثر بحجم البيانات إطلاقًا |
| O(log n) | لوغاريتمي | البحث الثنائي في قائمة مرتّبة | يتضاعف حجم البيانات مقابل خطوة واحدة إضافية فقط |
| O(n) | خطي | المرور على كل عناصر قائمة مرة واحدة | يتضاعف العمل مع تضاعف البيانات |
| O(n log n) | خطي-لوغاريتمي | خوارزميات الفرز الجيدة مثل Merge Sort وQuick Sort | أفضل ما يمكن بلوغه عمومًا في الفرز بالمقارنة |
| O(n²) | تربيعي | حلقتان متداخلتان مثل Bubble Sort | ألف عنصر تعني مليون عملية |
| O(2ⁿ) | أُسّي | تجربة كل الاحتمالات (بعض مسائل التوافيق) | يصبح غير عملي حتى مع أرقام صغيرة نسبيًا |
كلما اتجهنا للأسفل ساء الأداء عند كبر البيانات. لذلك، عند التعامل مع ملايين السجلات، يكون الفرق بين O(n log n) وO(n²) هو الفرق بين ثوانٍ وساعات.
كيف تحسب تعقيد كودك عمليًا؟
- عُدّ الحلقات (Loops): حلقة واحدة تمرّ على n عنصر ← O(n). حلقتان متداخلتان ← O(n²).
- انتبه للتقسيم المتكرر: إذا كانت الخوارزمية تقسم المشكلة إلى نصفين في كل خطوة (كالبحث الثنائي) ← O(log n).
- اجمع ثم بسّط: اجمع تعقيد الأجزاء، ثم احتفظ بالحدّ المسيطر فقط واحذف الثوابت.
- افصل قياس الذاكرة: احسب المتغيرات والهياكل الإضافية التي تُنشئها الخوارزمية لتقدير التعقيد المكاني.
الحالة الأفضل والأسوأ والمتوسطة
الخوارزمية الواحدة قد يتغيّر أداؤها حسب المدخلات. مثال Quick Sort: متوسط حالته ممتاز O(n log n)، لكن أسوأ حالته قد تصل إلى O(n²) مع ترتيب مدخلات سيّئ. عادةً نستخدم Big O للتعبير عن أسوأ الحالات لأنها الضمانة التي نبني عليها، لكن معرفة الحالة المتوسطة مهمة لاتخاذ قرار واقعي.
خطأ شائع يقع فيه المبتدئون
لا تختر دائمًا الخوارزمية ذات الرتبة «الأفضل» نظريًا. مع بيانات صغيرة قد تتفوّق خوارزمية O(n²) بسيطة على خوارزمية O(n log n) معقدة، لأن الثوابت والتكلفة الخفية (كإنشاء كائنات أو استدعاءات دالة كثيرة) تلعب دورًا لا تُظهره نوتة O. القاعدة العملية: احسب التعقيد لتفهم قابلية التوسّع، لكن قِس الأداء الفعلي (Benchmarking) قبل الحسم.
الأسئلة الشائعة
هل التعقيد يقيس سرعة الخوارزمية بالثواني؟ لا. هو يصف معدّل نمو الوقت أو الذاكرة مع كبر المدخلات، وليس زمنًا مطلقًا يعتمد على جهازك أو لغتك.
ما الفرق بين O و Ω و Θ؟ O تصف الحد الأعلى (أسوأ حالة)، وΩ تصف الحد الأدنى (أفضل حالة)، وΘ تصف الحالة عندما يتطابق الحدّان. الأشيع في العمل اليومي هو O.
أيهما أهم: التعقيد الزمني أم المكاني؟ غالبًا الزمني، لكن في البيئات محدودة الذاكرة (الهواتف، الأنظمة المدمجة) قد يصبح المكاني هو القيد الحاسم.
هل أحتاج لحفظ رتب التعقيد عن ظهر قلب؟ يكفي أن تفهم منطقها وترتيبها. مع الممارسة ستتعرّف على نمط كل خوارزمية من شكل حلقاتها وطريقة تقسيمها للمشكلة.