On the Complexity of the Matching Problem of Regular Expressions with Backreferences
تحدد هذه الورقة التعقيد الحسابي دقيق التفاصيل لمطابقة التعبيرات المنتظمة مع المراجع الخلفية من خلال إثبات الحدود الدنيا المشروطة تحت افتراضات SETH واكتشاف المثلث، بينما تقدم خوارزمية محسنة بقدر للمراجع الخلفية ذات الاستخدام الواحد.
البحث الأصلي مرخَّص بموجب CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). هذا شرح مولَّده بالذكاء الاصطناعي للبحث أدناه. لم يكتبه المؤلفون ولم يصادقوا عليه. وللتحقق من الدقة التقنية، يرجى الرجوع إلى البحث الأصلي. اقرأ إخلاء المسؤولية الكامل
إليك شرح لورقة بحثية بعنوان "حول تعقيد مشكلة المطابقة للتعبيرات النمطية ذات المراجع الخلفية"، مترجمة إلى لغة يومية باستخدام التشبيهات.
الصورة الكبيرة: ازدحام حركة المرور في "الريجيكس" (Regex)
تخيل أنك حارس أمن في ملهى ليلي (نظام كمبيوتر). لديك قائمة من القواعد (تعبير نمطي - Regular Expression) لتحديد من يُسمح له بالدخول.
- القواعد البسيطة: "فقط الأشخاص الذين يرتدون قمصانًا حمراء". هذا سهل التحقق منه. تنظر إلى القميص وتقول: "أحمر؟ نعم، تفضل بالدخول". يستغرق الأمر نفس الوقت سواء كان الطابور مكونًا من 10 أشخاص أو 10,000 شخص.
- المشكلة (ReDoS): أحيانًا، يقوم المتسللون (الهاكرز) بصياغة طابور معين من الأشخاص لخداع الحارس وجعله يقوم بكم هائل من العمل غير الضروري. بدلًا من فحص شخص واحد والمضي قدمًا، يبدأ الحارس بفحص الشخص (أ)، ثم الشخص (ب)، ثم الشخص (أ) مرة أخرى، ثم الشخص (ج)، ثم الشخص (أ) مرة أخرى... حتى ينهار الحارس من الإرهاق. يسمى هذا هجوم حجب الخدمة (ReDoS).
في العالم الحقيقي، تسبب هذا في تعطل مواقع إلكترونية ضخمة مثل Stack Overflow و Cloudflare. تشير الورقة البحثية إلى أن حتى البطء "التربيعي" (حيث يستغرق فحص 100 شخص 10,000 خطوة) كافٍ لتدمير النظام.
الشرير: "المراجع الخلفية" (Backreferences)
القواعد القياسية بسيطة. لكن محركات "الريجيكس" الحديثة لديها ميزة قوية للغاية تسمى المراجع الخلفية (Backreferences).
التشبيه:
تخيل قاعدة تقول: "ابحث عن كلمة، تذكرها، ثم تأكد من ظهور نفس الكلمة تمامًا مرة أخرى لاحقًا".
- مثال: "ابحث عن كلمة، سمِّها 'X'. ثم ابحث عن 'X' مرة أخرى".
- إذا كان المدخل هو
apple ... appleفإنه يعمل. - إذا كان المدخل هو
apple ... bananaفإنه يفشل.
هذه الميزة مفيدة للغاية للمبرمجين، لكنها تجعل مهمة "الحارس" أصعب بكثير. يجب على الحارس أن يتذكر ما رآه سابقًا ويقارنه باستمرار بما يراه الآن. تسأل الورقة البحثية: هل يمكننا بناء حارس سريع بما يكفي للتعامل مع هذه القواعد المعقدة دون أن يتعب؟
نتائج الورقة البحثية: الجيد، والسيئ، والقبيح
بحث المؤلفون بدقة في مدى صعوبة حل مشكلات المطابقة هذه. وقد قسموها إلى جانبين: الصعوبة (Hardness) (لماذا هي صعبة) و الخواروات (Algorithms) (كيفية إصلاحها).
1. الأخبار السيئة: بعض القواعد مستحيلة التسريع
تثبت الورقة أنه بالنسبة لأنواع معينة من القواعد المعقدة، لا توجد "رصاصة سحرية" لجعلها سريعة.
- مشكلة "المثلث": أظهروا أنه إذا كانت لديك قاعدة تستخدم متغيرين (مثل تذكر كلمتين مختلفتين والتحقق منهما لاحقًا)، فإن حلها يصعب مثل العثور على مثلث في شبكة اجتماعية ضاسية. إذا استطعت حل القاعدة بسرعة، يمكنك حل مشكلة الرسم البياني (Graph) بسرعة. وبما أن خبراء الرسوم البيانية يعتقدون أن مشكلة الرسم البياني بطيئة بطبيعتها، فإن مشكلة القاعدة يجب أن تكون بطيئة أيضًا.
- مشكلة "المتجهات المتعامدة" (Orthogonal Vectors): بالنسبة للقواعد التي تحتوي على متغيرات أكثر، أثبتوا أن الوقت المطلوب ينمو بشكل أسي مع عدد المتغيرات. الأمر يشبه محاولة العثور على تركيبة مفاتيح محددة في قفل؛ كلما زاد عدد المفاتيح، أصبح الأمر مستحيلاً عبر التجربة والخطأ السريعة.
الخلاصة: إذا كانت قاعدتك معقدة جدًا (تستخدم الكثير من ميزات "تذكر هذا")، فلا يمكنك بناء محرك سريع لها. ستصطدم دائمًا بالحائط.
2. الأخبار الجيدة: حل "شبه خطي" للحالات البسيطة
ومع ذلك، وجدت الورقة "نقطة مثالية". فقد ركزوا على نوع محدد وشائع من القواعد:
- نمط "ABCBD": "ابحث عن كلمة (A)، ثم كلمة (B)، ثم كلمة (C)، ثم نفس الكلمة B تمامًا مرة أخرى، ثم كلمة (D)".
- مثال من الواقع: "ابحث عن اسم المستخدم، ثم كلمة المرور، ثم الرسالة، ثم نفس اسم المستخدم مرة أخرى، ثم التوقيع".
اكتشف المؤلفون أنه رغم أن هذا يبدو صعبًا، إلا أنه يمكن حله بكفاءة عالية.
- الطريقة القديمة: الطرق السابقة كانت تشبه فحص كل التركيبات الممكنة في مكتبة، وهو ما يستغرق وقتًا قدره (تربيعي). إذا كان الكتاب مكونًا من 1,000 صفحة، فسيستغرق 1,000,000 خطوة.
- الطريقة الجديدة: بنى المؤلفون خوارزمية جديدة تستغح زمنًا قدره تقريبًا.
- التشبيه: تخيل أن المكتبة منظمة بنظام فهرس سحري (باستخدام أشجار اللاحقة - Suffix Trees و غابات التفكيك - Factorization Forests). بدلًا من قراءة كل صفحة، يمكن للحارس القفز مباشرة إلى الأقسام ذات الصلة. إذا كان الكتاب مكونًا من 1,000 صفحة، فإن الطريقة الجديدة تستغرق حوالي 10,000 خطوة (أو أقل)، وهو تحسن هائل.
كيف تعمل الخوارزمية الجديدة (الخدع السحرية)
لتحقيق هذه السرعة، استخدم المؤلفون عدة تقنيات ذكية وصفوها في الورقة:
- شجرة اللاحقة (الخريطة): قاموا ببناء خريطة ضخمة للنص المدخل. تظهر هذه الخريطة كل نهاية ممكنة للنص. وهي تساعد الحارس على رؤية: "أوه، الكلمة 'B' تظهر هنا، وتظهر أيضًا هناك" بشكل فوري.
- التفكيك الثقيل-الخفيف (قبعة التنسيق): قاموا بتقسيم الخريطة إلى مسارات "ثقيلة" (مسارات شائعة جدًا) ومسارات "خفيفة" (مسارات نادرة). إنهم يقومون بالعمل الشاق فقط على المسارات النادرة، مما يوفر الوقت.
- الدورية (الإيقاع): لاحظوا أنه عندما تتكرر كلمة (مثل "B...B")، فإن النص غالبًا ما يكون له إيقاع أو نمط. استخدموا الرياضيات للتنبؤ بهذه الأنماط بدلًا من فحص كل حرف على حدة.
- غابات التفكيك (الفهرس): هذا هيكل بيانات يعمل كفهرس فائق السرعة، مما يسم يسمح للحارس بالتحقق مما إذا كان جزء من النص يطابق قاعدة ما في وقت ثابت، بغض النظر عن طول النص.
ملخص الاستنتاج
- هل يمكننا إيقاف جميع هجمات ReDoS؟ لا. إذا كانت القاعدة معقدة جدًا (تستخدم الكثير من متغيرات "تذكر هذا")، فقد ثبت رياضيًا أنها بطيئة.
- هل يمكننا إصلاح القواعد المعقدة الأكثر شيوعًا؟ نعم! بالنسبة للحالة المحددة حيث تتذكر القاعدة كلمة واحدة وتتحقق منها مرة واحدة لاحقًا (نمط "ABCBD")، فقد ابتكر المؤلفون محركًا جديدًا يكاد يكون بنفس سرعة القواعد البسيطة.
- لماذا يهم هذا؟ هذا يخبر مهندسي البرمجيات: "لا تستخدموا الكثير من المراجع الخلفية، وإلا ستكونون بطيئين. ولكن إذا استخدمتموها بهذه الطريقة المحددة والشائعة، فيمكنكم الآن استخدام طريقتنا الجديدة للحفاظ على نظامكم آمنًا وسريعًا".
لقد رسمت الورقة البحثية في الأساس خطًا في الرمل: هنا حيث يكون حد السرعة غير قابل للكسر، وهنا حيث وجدنا طريقة للقيادة بشكل أسرع.
غارق في أبحاث مجالك؟
تصلك نشرة يومية بأحدث الأبحاث المطابقة لكلماتك البحثية المفتاحية — مع ملخصات تقنية، بلغتك.