الانتقال إلى المحتوى
Foxipa

أداة التعقيد

حاسبة Big-O

الصق كود جافاسكريبت واحصل على التعقيد الزمني والمكاني مع اشتقاق خطوة بخطوة وخريطة للحلقات وافتراضات صريحة. قارن نسختين جنبًا إلى جنب واستكشف منحنيات النمو.

يعمل بالكامل في متصفحك — كودك لا يغادر الصفحة أبدًا.

الصق دالة أو مقتطفًا وستعرض الحاسبة التعقيد الزمني والتعقيد المكاني، ثم تُظهر طريقة عملها: اشتقاقًا مرقّمًا لكل حلقة واستدعاء وفرع ذاتي، وخريطة حلقات تُعلّم كل سطر بمضاعفه (×n، ×log n)، وقائمة صريحة بكل افتراض اضطرّ التحليل إلى اتخاذه. كل شيء يعمل محليًا في متصفحك — الكود الذي تلصقه لا يغادر الصفحة أبدًا.

كيف يعمل التحليل

يحلّل المحرّك جافاسكريبت إلى شجرة نحوية (AST) ثم يمرّ بها مركّبًا حدود الكلفة. التعليمات المتسلسلة تتحد بالحد المهيمن من المجموع؛ ذراعا if/else تكلّف الحد الأقصى منهما لأن واحدًا فقط ينفّذ. الحلقات تضاعف: حلقة يتقدم متغيرها بمقدار ثابت تسهم بـ ×n، وحلقة يتضاعف متغيرها أو يتنصّف (i *= 2 أو i /= 2 أو i >>= 1) تسهم بـ ×log n. أما الاستدعاء الذاتي فيمر عبر مبرهنة العمل — T(n) = a·T(n/b) + f(n) — مع عدّ a على طول مسارات التنفيذ الفعلية، فبحث ثنائي يستدعي نفسه من جهة واحدة يُعامل صحيحًا كاستدعاء واحد لكل مستوى، بينما فيبوناتشي الساذج المتفرع إلى استدعاءين يُعرض كـ O(2ⁿ).

العمليات المدمجة لها جدول كلف بالحالة الأسوأ: ‎.map()‎ و.filter()‎ و.forEach()‎ بتعقيد O(n)، و.sort()‎ بتعقيد O(n log n)، وMap.has()‎ بتعقيد O(1)، و.includes()‎ و.indexOf()‎ بتعقيد O(n)، و.push()‎ بتعقيد O(1). الاستدعاءات التي لا يستطيع المحرك رؤيتها لا تُخمَّن بصمت — بل تُفترض O(1) وتُعلن في قائمة الافتراضات، لذا تعرف دائمًا أي أجزاء الجواب مقاسة وأيها فروض.

ماذا تعني الخطوات والافتراضات

لوحة خطوة بخطوة هي الاشتقاق: كل سطر يشرح قاعدة انطلقت، بالترتيب الذي ركّب به التحليل الحد النهائي. خريطة الحلقات تعرض كل حلقة برقم سطرها ومساهمتها — أسرع طريقة لتحديد السطر الذي يحوّل مسحًا بـ O(n) إلى O(n²). لوحة الافتراضات هي طبقة الصدق: حدود الحلقات تُعامل كحجم المُدخل n (العرف القياسي)، وعبارات return المبكرة داخل الحلقات تعرض الحالة الأسوأ، والدوال غير المعروفة تُذكر كمفترضة O(1). التحليل المقاربي الدقيق غير قابل للحل في العموم — وأي أداة لا تعترف بذلك تخمّن في الخفاء، وهذه تفضّل الإظهار.

مقارنة نسختين

تبويب المقارنة يحلّل مقتطفين جنبًا إلى جنب ويصدر الحكم عند حجم تشغيل تختاره: عند n = 1000، ينفّذ مسح بـ O(n) نحو ألف عملية بينما تنفّذ حلقة أزواج بـ O(n²) مليون عملية — نحو 1000× من العمل. هذا هو إعادة الهيكلة الشهيرة في المقابلات بصورة مصغّرة: الصق two-sum بالقوة الغاشمة بحلقاتها المتداخلة بجانب نسخة خريطة التجزئة وراقب النسبة. وعندما يقع الطرفان في فئة النمو نفسها، يقول الحكم ذلك — عندها تحسم الثوابت، ولا يستطيع التحليل المقاربي شيئًا.

منحنيات النمو وميزانية الثانية الواحدة

تبويب النمو يرسم أعداد العمليات للفئات القياسية — O(1) وO(log n) وO(n) وO(n log n) وO(n²) وO(n³) وO(2ⁿ) وO(n!) — على مقياس لوغاريتمي يصبح فيه كل صنف منحنى مقروءًا (العائلتان الأسّية والعواملية لا تسعان إلا المقياس اللوغاريتمي، وهذا بالضبط المقصود). الجدول أسفل المخطط يعدّ العمليات عند n من 10 إلى مليون ويعرض أكبر n ينهي كل صنف عمله خلال ثانية واحدة، بافتراض نحو 10⁸ عمليات بسيطة في الثانية. الخوارزمية التربيعية تستنفد الميزانية عند n ≈ 10000؛ والخطية تبلغ مئة مليون. هذه العتبات، أكثر من أي صيغة، هي معنى «أسرع» عمليًا.

أسئلة شائعة

ما اللغات التي يفهمها المحلّل؟ جافاسكريبت (بما فيها الصياغة الحديثة). التحليل نفسه قائم على الشكل — حلقات واستدعاء ذاتي وبنية الاستدعاءات — فالمنطق ذاته ينتقل إلى مقتطفات Java أو Python أو ++C المشابهة شكلًا، لكن جافاسكريبت فقط هي التي تُحلَّل مباشرة.

هل يمكن أن يخطئ؟ إنه محلّل استدلالي، ويقول ذلك. الحدود المعتمدة على البيانات والتذكّر والخوارزميات الذكية تتجاوز التحليل الساكن عمومًا؛ في تلك الحالات يعرض الأداة أسوأ حالة يستطيع الدفاع عنها ويسرد الافتراض الذي اتخذه. أما الأنماط التعليمية القياسية — المسوح والحلقات المتداخلة والبحث الثنائي وترتيب الدمج وحلقات البرمجة الديناميكية — فتصنيفها يطابق الكتاب.

على أي شيء يقوم التعقيد المكاني؟ التخصيصات التي يعتمد حجمها على n (المصفوفات و.slice()‎ وMap/Set)، والقيم المتراكمة عبر دورات الحلقات، وعمق الاستدعاء الذاتي. مصفوفة تُبنى صفًا صفًا داخل حلقة تعقدها المكاني O(n²)؛ والمصفوفات المساعدة في ترتيب الدمج تجعله O(n).

هل يُرسل كودي إلى أي مكان؟ لا. التحليل والرسوم والمقارنة كلها تعمل في متصفحك؛ لا يوجد اتصال بخادم، ولا تسجيل لكودك، ولا يُحفظ شيء سوى مدخلاتك الأخيرة في التخزين المحلي لمتصفحك أنت.