تخطَّ إلى المحتوى

Two Pointers

تقنية المؤشّرين Two Pointers

تقنية المؤشّرين تستخدم مؤشّرين يتحرّكان عبر مصفوفة (غالبًا مرتّبة) لحلّ مسائل بتعقيد O(n) بدل الحل الساذج O(n²) بحلقتين متداخلتين.

بدل مقارنة كل زوج ممكن من العناصر (O(n²))، يتحرّك مؤشّران — عادة من الطرفين نحو المنتصف، أو أحدهما يتقدّم أسرع من الآخر — بحيث يُستبعد جزء من الاحتمالات بكل خطوة اعتمادًا على مقارنة بسيطة. تعتمد الفعالية غالبًا على كون البيانات مرتّبة سلفًا.

الصياغة

left, right = 0, len(arr) - 1
while left < right:
    # قارن أو اجمع arr[left] و arr[right]
    # حرّك left أو right حسب النتيجة

📄 مثال

def has_pair_with_sum(arr, target):
    left, right = 0, len(arr) - 1
    while left < right:
        current_sum = arr[left] + arr[right]
        if current_sum == target:
            return True
        elif current_sum < target:
            left += 1   # نحتاج مجموعًا أكبر
        else:
            right -= 1  # نحتاج مجموعًا أصغر
    return False

sorted_arr = [1, 2, 4, 7, 11, 15]
print(has_pair_with_sum(sorted_arr, 15))  # True (4 + 11)

أهم النقاط

النقطةالوظيفة
التعقيد الزمنيO(n) عادةً — بدل O(n²) بالحل الساذج بحلقتين متداخلتين
التعقيد المكانيO(1) — لا يحتاج ذاكرة إضافية عادةً
الشرط الشائعغالبًا تحتاج بيانات مرتّبة مسبقًا لتعمل بمنطقها الأساسي (كمثال إيجاد زوج بمجموع معيّن)

💡 نصائح عملية

  • أي مسألة على مصفوفة مرتّبة تسأل عن 'زوج' أو 'ثلاثي' بشرط معيّن (مجموع، فرق) — جرّب المؤشّرين قبل أي حل آخر

⚠️ أخطاء شائعة

  • تطبيقها على بيانات غير مرتّبة بمنطق يفترض الترتيب (كإيجاد زوج بمجموع معيّن) — يُعطي نتائج خاطئة، رتّب البيانات أولًا إن لزم

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DSA الكامل بالعربي.