قائمة الانتظار هي عملية تضيف عنصرا إلى نهاية قائمة الانتظار. إنها إحدى العمليات الرئيسية في الخوارزميات وهياكل البيانات. كمب (كانوث-موريس-برات) هو خوارزمية للبحث عن سلسلة فرعية في سلسلة ، والتي تقوم على استخدام وظيفة البادئة.
في خوارزمية كمب ، يتم استخدام وظيفة البادئة لتحسين البحث فرعية. يسمح لك باستخدام معلومات حول المقارنات السابقة لتحديد الموضع التالي الذي تبدأ منه المقارنة. هذا يقلل من عدد المقارنات ويزيد من سرعة الخوارزمية.
يتم استخدام قائمة انتظار إنكيو في خوارزمية كمب لتخزين فهارس تكرارات فرعية في سلسلة. يتيح لك ذلك الحصول على معلومات حول موضع السلسلة الفرعية التي تم العثور عليها دون الحاجة إلى إجراء مقارنات متكررة.
- قائمة الانتظار في كمب: إزالة عنصر من قائمة الانتظار
- الوظائف وهياكل البيانات
- تنفيذ الخوارزمية
- الخوارزمية لحذف عنصر
- مثال الاستخدام
- مزايا وعيوب
- المزايا:
- العيوب:
- خيارات التحسين
- سؤال وجواب
- كيف يمكنني إزالة عنصر من قائمة الانتظار باستخدام قائمة الانتظار في خوارزمية كمب?
- هل من الممكن استخدام طريقة إنكيو لحذف العنصر الأخير في قائمة الانتظار في خوارزمية كمب?
- كيف يمكنني إزالة كافة العناصر من قائمة الانتظار باستخدام قائمة الانتظار في خوارزمية كمب?
قائمة الانتظار في كمب: إزالة عنصر من قائمة الانتظار
إنكيو هو عملية إضافة عنصر إلى قائمة الانتظار في خوارزمية كانوث-موريس-برات (كمب). ومع ذلك ، في بعض الحالات قد يكون من الضروري إزالة عنصر من قائمة الانتظار. لنلق نظرة على الأساليب المختلفة لتنفيذ إزالة عنصر من قائمة الانتظار.
1. الحذف حسب القيمة-يبحث هذا الأسلوب عن عنصر في قائمة الانتظار بالقيمة المحددة. إذا تم العثور على عنصر ، فسيتم إزالته من قائمة الانتظار. ومع ذلك ، فإن هذا النهج محفوف ببعض الصعوبات ، حيث قد تكون هناك عناصر بنفس القيم في قائمة الانتظار. عند حذف عنصر، من الضروري تحديد العنصر الذي يجب حذفه (على سبيل المثال ، العنصر الأول الذي تم العثور عليه أو جميع العناصر ذات القيمة المحددة). ضع في اعتبارك أيضا أنه عند حذف عنصر من قائمة الانتظار ، قد يتغير هيكله.
2. الحذف حسب الفهرس - في خوارزمية كمب ، وعادة ما تستخدم قائمة الانتظار كمصفوفة ، حيث يتم إضافة العناصر إلى النهاية وحذفها من البداية. لذلك ، فإن حذف عنصر حسب الفهرس أسهل في التنفيذ من الحذف حسب القيمة. لحذف عنصر به فهرس معين ، تحتاج إلى نقل جميع العناصر بعده إلى موضع واحد إلى اليسار. بعد ذلك ، يتم حذف العنصر الأخير الذي كان في نهاية قائمة الانتظار. يعمل هذا النهج بشكل فعال ، ولكنه يتطلب إعادة توزيع جميع العناصر بعد الحذف.
إنت ديكو (إنت[] طابور ، إنت حجم) {
// الحصول على العنصر الأول من قائمة الانتظار
إنت فيرستليمنت = طابور [0];
// نقل جميع العناصر إلى اليسار
ل (إنت أنا = 0 ؛ أنا < حجم-1 ؛ أنا {) {
قائمة الانتظار [أنا] = قائمة الانتظار [أنا + 1];
}
// تقليل حجم قائمة الانتظار
الحجم--;
// إرجاع العنصر المحذوف
العودة أولايوان;
}
إزالة عنصر من قائمة الانتظار في خوارزمية كمب يمكن أن تكون مفيدة في حالات مختلفة. من المهم اختيار طريقة الإزالة المناسبة اعتمادا على متطلبات وخصائص المهمة المحددة.
الوظائف وهياكل البيانات
في البرمجة ، تلعب الوظائف وهياكل البيانات دورا مهما لأنها تسمح لك بتنظيم الكود وهيكله ، مما يجعله أكثر قابلية للفهم وكفاءة.
الوظائف هي مجموعة من التعليمات التي تؤدي مهمة محددة. يمكنهم قبول الحجج وتنفيذ العمليات عليها وإرجاع النتيجة. تساعد الوظائف على تقسيم البرنامج إلى وحدات منفصلة ، مما يبسط تطويره ودعمه.
هياكل البيانات ، بدورها ، هي حاويات تستخدم لتنظيم البيانات وتخزينها. تتيح هياكل البيانات معالجة المعلومات بكفاءة وتحسين الوصول إليها وتبسيط استخدامها. على سبيل المثال ، تعد القائمة والمكدس وقائمة الانتظار هياكل بيانات شائعة تستخدم لتخزين ومعالجة سلسلة من العناصر.
واحدة من هياكل البيانات الأكثر شيوعا هي مجموعة. المصفوفة هي مجموعة مرتبة من العناصر التي يتم الوصول إليها بواسطة فهرس. نظرا لسهولة استخدامها وكفاءتها ، تستخدم المصفوفات على نطاق واسع في البرمجة.
إلى جانب المصفوفات ، هناك أيضا العديد من هياكل البيانات الأخرى مثل القوائم المرتبطة والأشجار وجداول التجزئة والرسوم البيانية. كل بنية بيانات لها خصائصها الخاصة وتستخدم في مواقف مختلفة.
يعتمد اختيار بنية البيانات على متطلبات البرنامج وخصائص المهمة. من المهم مراعاة كفاءة الوصول إلى العناصر ووقت تنفيذ العمليات ومتطلبات استخدام الذاكرة.
الوظائف وهياكل البيانات هي اللبنات الأساسية للبرمجة. يتيح لك استخدامها بشكل صحيح إنشاء حلول فعالة وتبسيط عملية تطوير البرامج.
تنفيذ الخوارزمية
ويستند خوارزمية لإزالة عنصر من قائمة الانتظار في شكل" إنكيو " في خوارزمية كانوث-موريس-برات (كمب) على العمل مع اثنين من المؤشرات إلى بداية ونهاية قائمة الانتظار.
1. نتحقق مما إذا كانت قائمة الانتظار فارغة. إذا كانت قائمة الانتظار فارغة ، فإننا نصدر رسالة تفيد بأن الحذف غير ممكن.
2. إذا لم تكن قائمة الانتظار فارغة ، فتحقق مما إذا كان هناك عنصر واحد فقط في قائمة الانتظار. إذا كانت هذه هي الحالة ، فقم بحذفها وعرض رسالة تفيد بأن العنصر قد تم حذفه. المؤشر إلى بداية ونهاية قائمة الانتظار هو صفر.
3. إذا كانت قائمة الانتظار تحتوي على أكثر من عنصر واحد ، فسيكون العنصر المراد حذفه في بداية قائمة الانتظار ، لذلك لحذفه ، تحتاج إلى تحريك المؤشر إلى بداية قائمة الانتظار (الرأس) إلى العنصر التالي بعده. نصدر رسالة مفادها أنه تم حذف العنصر.
4. قم بتحديث المؤشر إلى بداية قائمة الانتظار (الرأس) إلى العنصر التالي ، وإلا سيصبح طول قائمة الانتظار صفرا.
5. قم بتحديث المؤشر إلى نهاية قائمة الانتظار (الذيل) إلى العنصر التالي بعده. إذا كان المؤشر إلى بداية قائمة انتظار الرأس يساوي المؤشر إلى نهاية قائمة انتظار الذيل ، فإن قائمة الانتظار تصبح فارغة. نحن نرسل رسالة مفادها أن قائمة الانتظار فارغة.
6. إرجاع العنصر المحذوف.
الخوارزمية لحذف عنصر
يمكن تنفيذها على النحو التالي:
- ، والتي ترجع فهرس العنصر.
- إذا تم العثور على عنصر ، فاحذفه من المجموعة.
- عند حذف عنصر ، قم بتحديث المتغيرات والفهارس الداخلية للحفاظ على الترتيب الصحيح للعناصر في قائمة الانتظار.
مثال على تنفيذ الخوارزمية:
إذا (قائمة الانتظار.يحتوي على (عنصر))
{
مؤشر كثافة العمليات = قائمة الانتظار.فهرس (عنصر);
طابور.ريموفيت (فهرس);
إلى عن على (الباحث الأول = فهرس; أنا < قائمة الانتظار.العد ؛ أنا i)
{
قائمة الانتظار [أنا] = قائمة الانتظار [أنا + 1];
}
طابور.العد--;
}
. بعد ذلك ، يتم تحديث المتغيرات والفهارس الداخلية للعناصر الموجودة في قائمة الانتظار.
مثال الاستخدام
هنا مثال على استخدام وظيفة إنكيو () في خوارزمية كمب:
- إنشاء سلسلة المصدر وسلسلة النمط التي سيتم إجراء البحث فيها.
- إنشاء صفيف لبس مع حجم يساوي طول سلسلة نمط. قيمة كل عنصر من عناصر المصفوفة هي طول اللاحقة القصوى ، وهي أيضا بادئة.
- تهيئة المتغيرات أنا و ي إلى الصفر. المتغير سوف تستخدم لتكرار من خلال عناصر مجموعة نمط ، والمتغير ي لتخزين قيمة لبس لكل عنصر من عناصر المصفوفة.
- نبدأ حلقة بينما ، الذي يبحث عن المباريات بين نمط والمصدر.
- إذا كان المصدر الحالي[أنا] حرف يطابق النمط الحالي [ي] حرف ، زيادة أنا و ي بنسبة 1.
- إذا ي يساوي طول سلسلة النمط ، تم العثور على تطابق. إضافة فهرس بداية المباراة إلى قائمة الانتظار.
- إذا كنت أقل من طول السلسلة المصدر والأحرف الحالية لا تتطابق ، تحقق مما إذا كان هناك مباراة سابقة وتحول ي إلى لس[ي-1].
- Если j равно 0, значит, не найдено совпадение и сдвигаем i на 1.
- Возвращаем полученную очередь с индексами начала совпадений.
Пример кода:
fun enqueue(source: String, pattern: String): Queue {
val queue = LinkedList()
val lps = computeLPS(pattern)
var i = 0
var j = 0
while (i < source.length) {
if (pattern[j] == source[i]) {
i++
j++
if (j == pattern.length) {
queue.add(i - j)
j = lps[j - 1]
}
} else {
if (j != 0) {
j = lps[j - 1]
} else {
i++
}
}
}
return queue
}
في هذا المثال ، يتم استخدام وظيفة إنكيو () للبحث عن جميع تكرارات سلسلة النمط في السلسلة المصدر. يتم وضع فهارس بدء المطابقة الناتجة في قائمة الانتظار ثم إرجاعها.
مزايا وعيوب
قائمة الانتظار في كمب هو أداة قوية يمكن أن تكون مفيدة جدا في تطوير البرمجيات. ومع ذلك ، مثل أي أداة أخرى ، لديها مزاياها وعيوبها التي ينبغي النظر فيها.
المزايا:
- المرونة: يسمح لك قائمة الانتظار بإدارة ترتيب المهام والأحداث بشكل فعال.
- منظمة الكود: استخدام إنكيو في كمب يساعد على هيكلة التعليمات البرمجية وتقسيمها إلى أقسام منطقية ، مما يجعل من السهل فهم والحفاظ عليها.
- قابلية التوسع: يوفر قائمة الانتظار القدرة على توسيع نطاق التطبيق ، مما يسمح لك بإضافة مهام وأحداث جديدة دون التأثير على التعليمات البرمجية الموجودة.
- تعدد الاستخدامات: يمكن استخدام قائمة الانتظار في سيناريوهات مختلفة وعلى منصات مختلفة ، مما يجعلها أداة مرنة للغاية.
العيوب:
- الصعوبة: يمكن أن تكون قائمة الانتظار صعبة للمبتدئين وتتطلب مستوى معينا من المعرفة والخبرة.
- المضاعفات المفرطة: في بعض الأحيان يمكن أن تصبح قائمة الانتظار زائدة عن الحاجة ، خاصة في حالة المهام البسيطة أو التطبيقات الصغيرة.
- إدارة الأخطاء: عند استخدام قائمة الانتظار ، قد يكون من الصعب التعامل مع الأخطاء وإدارة الاستثناءات.
- التبعية: باستخدام إنكيو في كمب يخلق الاعتماد على هذه المكتبة ، والتي قد تكون غير مرغوب فيها في بعض الحالات.
على الرغم من بعض القيود والتعقيدات ، إنكيو في كمب لديها مزايا أكثر من العيوب ، وهذا هو السبب في أنها تعتبر أداة فعالة لإدارة المهام والأحداث في تطوير البرمجيات.
خيارات التحسين
في هذه المقالة ، سوف ننظر في العديد من خيارات التحسين عند استخدام وظيفة إنكيو في خوارزمية كمب.
تحسين الذاكرة: عندما نستخدم وظيفة قائمة الانتظار لإضافة عناصر إلى قائمة الانتظار ، قد نواجه مشكلة تخصيص كمية كبيرة من الذاكرة. لتجنب هذه المشكلة ، يمكنك استخدام حجم قائمة انتظار ثابت. في هذه الحالة ، إذا كانت قائمة الانتظار مليئة بالفعل بالحد الأقصى لعدد العناصر ، فيمكننا تخطي إضافة عنصر جديد أو استبدال العنصر القديم بعنصر جديد.
تحسين وقت التنفيذ: عند استخدام قائمة الانتظار ، نضيف عنصر جديد إلى نهاية قائمة الانتظار. ومع ذلك ، إذا علمنا أن قائمة الانتظار كبيرة بالفعل بما يكفي ونحتاج إلى توفير الوقت في إضافة عناصر جديدة ، فيمكننا استخدام ديكو لحذف عنصر واحد أو أكثر في بداية قائمة الانتظار وإضافة عنصر جديد إلى النهاية.
تحسين استخدام الذاكرة: إذا كنت بحاجة إلى حفظ الذاكرة ، فيمكنك استخدام بنية بيانات خاصة مثل قائمة انتظار رنين أو قائمة انتظار ثنائية الاتجاه. تتيح لنا قائمة انتظار الحلقة استخدام الذاكرة بكفاءة ، لأن يسمح لك بإعادة استخدام الذاكرة المخصصة إذا كانت قائمة الانتظار ممتلئة. من ناحية أخرى ، تسمح لنا قائمة الانتظار ثنائية الاتجاه بإضافة وإزالة العناصر من بداية ونهاية قائمة الانتظار ، والتي يمكن أن تكون مفيدة في بعض الحالات.
تحسين الخوارزمية: إذا لاحظت أن وظيفة إنكيو يستغرق جزءا كبيرا من وقت تنفيذ البرنامج الخاص بك ، قد ترغب في النظر في تحسين الخوارزمية. ربما هناك خوارزمية بديلة أن يفعل الشيء نفسه ، ولكن أكثر كفاءة. بدلا من ذلك ، يمكنك التفكير في تحسين خوارزمية قائمة الانتظار نفسها ، على سبيل المثال ، باستخدام بنية بيانات مختلفة أو تغيير تنفيذها.
نتيجة لذلك ، سيعتمد اختيار التحسين على احتياجاتك وقيودك المحددة ، لذا جرب واختر تلك الخيارات الأكثر ملاءمة لمهمتك.
سؤال وجواب
كيف يمكنني إزالة عنصر من قائمة الانتظار باستخدام قائمة الانتظار في خوارزمية كمب?
خوارزمية كمب لا تنفذ إزالة العناصر من قائمة الانتظار ، لأنه مصمم للبحث عن سلسلة فرعية في سلسلة ، وليس لتعديل بنية البيانات. ومع ذلك ، إذا كنت بحاجة إلى إزالة عنصر من قائمة الانتظار باستخدام خوارزمية كمب ، يمكنك تعديل رمز الخوارزمية لإضافة هذه الوظيفة. على سبيل المثال ، يمكنك إضافة فحص للعناصر في قائمة الانتظار وحذف العناصر المقابلة إذا لزم الأمر. ومع ذلك ، يرجى ملاحظة أن هذا التعديل قد يؤثر على تعقيد الوقت للخوارزمية وتشغيلها الصحيح.
هل من الممكن استخدام طريقة إنكيو لحذف العنصر الأخير في قائمة الانتظار في خوارزمية كمب?
يتم استخدام طريقة قائمة الانتظار لإضافة عناصر إلى قائمة الانتظار ، وليس لحذفها. لإزالة العنصر الأخير من قائمة الانتظار في خوارزمية كمب ، يمكنك استخدام طريقة ديكو. تزيل هذه الطريقة العنصر الأول من قائمة الانتظار ، لذا يمكنك الاتصال به عدة مرات حتى تصل إلى العنصر الأخير في قائمة الانتظار.
كيف يمكنني إزالة كافة العناصر من قائمة الانتظار باستخدام قائمة الانتظار في خوارزمية كمب?
تم تصميم طريقة إنكيو لإضافة عناصر إلى قائمة الانتظار ، وليس حذفها. لإزالة كافة العناصر من قائمة الانتظار في خوارزمية كمب ، يمكنك استخدام طريقة واضحة. تزيل هذه الطريقة جميع العناصر من قائمة الانتظار ، وتتركها فارغة. يمكنك الاتصال به بعد العدد المطلوب من عمليات قائمة الانتظار لمسح قائمة الانتظار.