"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > شرح خوارزمية المؤشرين

شرح خوارزمية المؤشرين

تم النشر بتاريخ 2024-11-08
تصفح:155

Two pointers algorithm explained

أريد أن أشرح تقنية بسيطة وفعالة يمكنك استخدامها في المقابلة عند التعامل مع المصفوفات والسلاسل والقوائم المرتبطة وما إلى ذلك. سيؤدي ذلك أيضًا إلى تحسين معرفتك الأساسية حول هذه البيانات الهياكل.

لنبدأ من النظرية. هناك حالتان شائعتان للاستخدام لهذه الخوارزمية:

  • يسار/يمين المفهوم المركزي لهذه الخوارزمية هو أن يكون لديك متغيرين صحيحين ينتقلان من كلا جانبي السلسلة أو المصفوفة. عادة، يطلق عليه الناس اسم اليسار واليمين. سينتقل اليسار من الفهرس 0 إلى الطول — 1، واليمين هو العكس.

  • تعمل المؤشرات البطيئة/السريعة في نفس الاتجاه، على سبيل المثال، من البداية إلى النهاية، ولكن مؤشر واحد يعمل بشكل أسرع من الآخر. في هذه الحالة، عادةً ما يطلق الأشخاص على المتغيرات اسم البطيء والسريع.

الخوارزميات أساسية، وأفضل طريقة لفهمها هي النظر في بعض الأمثلة.

أولاً، دعونا نلقي نظرة على حالة تحتوي على مؤشرات لليسار ولليمين. فيما يلي مثال أولي لمشكلة يمكننا حلها باستخدام هذه الخوارزمية. الهدف واضح: نريد العثور على زوج يساوي مجموعه رقمًا معينًا.
سيؤدي أسلوب القوة الغاشمة إلى إنشاء حلقات متداخلة، ولكن هناك فرصة منخفضة لاجتياز المقابلة باستخدامه.
قد يكون الأسلوب الأفضل هو استخدام خوارزمية المؤشرين والعثور عليها في حلقة واحدة للحصول على تعقيد O(n) بدلاً من O(n²)


const findPair = (arr, target) => {
    let left = 0;                 // Start with two pointers left from start, right, from the end
    let right = arr.length - 1;

    while (left 

دعنا ننتقل إلى أسلوب تكون فيه المؤشرات بسرعات مختلفة. إنها مشكلة متكررة يمكنك إجراء مقابلة معها. تحتاج إلى العثور على منتصف القائمة المرتبطة المحددة.
إن نهج القوة الغاشمة ليس سيئا مثل المثال السابق، ولكن القائم بإجراء المقابلة يتوقع نهجا أفضل.
باستخدام خوارزمية المؤشرين، سوف تحل هذه المشكلة بتعقيد O(n)، في حين أن نهج القوة الغاشمة سيستغرق O(2n) إذا كنت تستخدم حلقتين متتابعتين.


class ListNode {
    constructor(value) {
        this.value = value;
        this.next = null;
    }
}

const findMiddle = (head) => {
    if (!head) return null;

    let slow = head;
    let fast = head;

    while (fast && fast.next) {
        slow = slow.next;           // Move slow pointer one step
        fast = fast.next.next;      // Move fast pointer two steps
    }

    return slow;  // Slow pointer will be at the middle
}

// Creating a linked list 1 -> 2 -> 3 -> 4 -> 5
const head = new ListNode(1);
const node2 = new ListNode(2);
const node3 = new ListNode(3);
const node4 = new ListNode(4);
const node5 = new ListNode(5);

head.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;

findMiddle(head).value);  // Output: 3 (middle node)


بيان الافراج تم نشر هذه المقالة على: https://dev.to/okaz/two-pointers-algorithm-explained-3k0e?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3