فكاهي: ما هو KMP الخوارزمية؟

الكاتب | رمادي صغير

المصدر | مبرمج رمادي صغير (ID: chengxuyuanxiaohui)

في اليوم التالي ----- -----

------------

مراجعة سابقة

في محاضرتين قبل خوارزمية مطابقة السلسلة، قدمنا BF خوارزمية العنف الخوارزمية، RK خوارزمية تستخدم تجزئة تتم مقارنة القيم، وكذلك للحد من عدد من المقارنات BM الخوارزمية، لم نر شريك صغير يمكن النقر على الرابط أدناه:

1. خوارزمية BF وRK خوارزمية

2. BM خوارزمية

إذا لم يكن هناك الوقت لإلقاء نظرة فاحصة لا يهم، اسمحوا لي أن يأخذك مشط لفترة وجيزة.

أولا، نظرا ل"التسلسل الرئيسي" و "سلسلة نمط" على النحو التالي:

كيفية عمل BF الخوارزمية؟

تماما كما تقف القوة الغاشمة، يستخدم خوارزمية BF بطريقة وحشية بسيطة، وسلاسل الرئيسية ومقارنة الطابع سلسلة نمط بحرف:

وجدت في الجولة الأولى، وسلسلة نمط الأولى وسلسلة مثل الرئيسي مقارنة سلسلة الابن الأكبر ليكون شخصية يتفق بت 0، 1 بت يتفق شخصية الطابع 2 غير متناسقة:

الجولة الثانية، سلسلة نمط تتحرك إلى الوراء، وسلسلة الرئيسية الثانية، وما إلى ذلك بالمقارنة الكبرى سلسلة، وشخصيات تم العثور على 0 التناقضات:

الجولة الثالثة نمط سلسلة لمواصلة التحرك واحدة الى الوراء، وسلاسل الرئيسية وغيرها الكبرى سلسلة مقارنة ابن الثالثة وجدت تناقضات 0 الشخصيات:

وهلم جرا، وصولا إلى N-تشرين الجولة:

عندما سلسلة طريقة للانتقال إلى مكان، حرف بحرف، وجدت أن كل حرف تلاءم، وينتهي المقارنة:

BF الخوارزمية أوجه القصور واضحة، وكفاءة منخفضة جدا، ويمكن أن تكون كل جولة فقط بصراحة الحق سلسلة نمط واحد، في الواقع، فعلت الكثير من المقارنات التي لا داعي لها.

الخوارزمية BM لحل هذه المشكلة. وهو ما يعني "حكم سيئة الحرف" و "حكم احقة جيدة"، عند المقارنة بين كل جولة، حتى أن سلسلة نمط قدر الإمكان لنقل عدد قليل، والحد من المقارنة لا داعي لها.

باستخدام خوارزمية BM، وأهم حاجة نمط سلسلة مطابقة العليا مقارنة فقط ثلاثة:

الفكرة كلها من خوارزمية KMP

KMP خوارزمية هي الفكرة كلها من ما يبدو؟ دعونا ننظر مجموعة من الأمثلة على ذلك:

"ابدأ" وBF في KMP الخوارزمية هي نفس الخوارزمية، ونفس السلسلة النموذج الرئيسي وسلسلة من أول الانحياز اليسار إلى اليمين من الطابع بالمقارنة الحرف.

الجولة الأولى، وسلسلة نمط الأولى وسلسلة مثل الرئيسي مقارنة سلسلة الابن الأكبر، تم العثور على الأحرف الخمسة الأولى المطابقة، لا يطابق الحرف السادس، و "حرف سيئة":

في هذا الوقت، وكيفية الاستخدام الفعال البادئة يقابل "GTGTG" ذلك؟

نحن يمكن العثور عليها في بادئة "GTGTG" بين الأحرف الثلاثة "GTG" وأول ثلاثة أحرف "GTG" هي نفسها:

وفي الجولة المقبلة من المقارنة، وهما فقط من نفس محاذاة هذه الشظايا، قد تحدث مطابقة فقط. هذه الشظايا السلسلتين، وتسمى أطول سلسلة فرعية مباريات لاحقة والبادئة أطول مباريات فرعية.

الجولة الثانية، ننتقل مباشرة إلى سلسلة وضع اثنين المتخلفة، حتى أن "GTG" اثنين من المحاذاة، تستمر تبدأ العملية مجرد سلسلة من الشخصية الرئيسية سيئة A:

ومن الواضح أن الشخصية الرئيسية سلاسل حرف لا يزال سيئا، وهذه المرة لتقصير مطابقة بادئة تصبح GTG:

وفقا لفكرة الجولة الأولى، يمكننا إعادة تحديد أطول مباراة ولاحقة أطول سلاسل فرعية مطابقة بادئة فرعية قد تكون:

الجولة الثالثة، ونحن مرة أخرى تتحرك إلى الوراء سلسلتين نمط، وجعل اثنين من "G" محاذاة، ومواصلة عملية تبدأ مجرد سلسلة من الشخصية الرئيسية سيئة A:

ما سبق هو الفكرة كلها KMP الخوارزمية: للعثور على أطول بادئة بين سلسلة فرعية مطابقة مباريات لاحقة وأطول مطابقة بادئة فرعية قد تكون مباشرة الى الدور المقبل من اثنين الانحياز، وبالتالي تحقيق سلسلة نمط الحركة السريعة.

مجموعة المقبلة

مجموعة المقبلة في نهاية المطاف ما هو الجحيم ذلك؟ هذا هو صفيف واحد الأبعاد من الأعداد الصحيحة في مجموعة تمثل منخفض "موقف متطابق المقبلة البادئة" قيمة العنصر هو "موقف المقبل قد يكون أطول سلاسل فرعية مباراة البادئة."

ولعل هذا الوصف تحجب نوعا ما، ونحن ننظر إلى الرسم البياني:

عندما لا تتطابق أول نمط سلسلة أحرف على أوتار الرئيسية، وهناك لم يقابل بادئة فرعية، ولكن أطول مطابقة بادئة فرعية قد تكون غائبة. هذه الحالة يتوافق مع منخفض مجموعة المقبل 0، بجانب قيمة العنصر هي 0.

إذا كانت بادئة مطابقة لG، GT، GTGTGC، وليس هناك أطول مطابقة بادئة فرعية قد يكون، قيمة عنصر الصفيف المقابلة المقبل (بجانب ، بجانب ، بجانب ) هو أيضا 0.

قد يكون GTG مباراة أطول بادئة G، المقابلة لمجموعة من القادمين ، قيمة العنصر هو 1.

وهلم جرا،

GTGT يتوافق المقبل ، وقيمة العنصر هو 2.

GTGTG يتوافق المقبل والقيم العنصر هو ثلاثة.

مع مجموعة المقبلة، ونحن يمكن أن تمر إلى البادئة الموضع التالي يقابل (سيئة موضع الحرف)، بسرعة العثور على الموقع التالي يمكن أن تتطابق مع أطول بادئة، ثم محاذاة هذين الموقفين.

على سبيل المثال السيناريو التالي، لدينا حرف سيئة من قبل مؤشر 5، يمكن العثور عليها بجوار = 3، أي موقف القادمة أطول بادئة مطابقة قد تكون:

ما تنتهي صفائف المقبلة، ثم نأتي للتفكير في كيفية المضي قدما جيل مجموعة المقبلة ذلك؟

منذ يتم مطابقة مجموعة سلسلة بادئة وسلسلة نمط الرئيسية بين نفسه، ولذا فإننا سلسلة فقط وفقا لطريقة، فإنه يكفي لتوليد مجموعة المقبلة.

وأسهل طريقة هي أطول بادئة سلاسل فرعية من البداية، لكل حالة محتملة للقيام المقارنة.

افترض سلسلة نمط طول متر، الحد الأقصى لعدد من المقارنات اللازمة لتوليد مجموعة المقبلة هو 1 + 2 + 3 + 4 + ...... + م 2 مرات.

ومن الواضح أن كفاءة هذه الطريقة منخفضة جدا، وكيفية تحسين ذلك؟

على غرار "البرمجة الديناميكية" نهج يمكننا استخدامها. أول المقبل والقادم يجب أن تكون قيمة 0، لأنه لا وجود له عندما فرعية البادئة، من القادم ، كل عنصر القادم للمجموعة يمكن أن تستمد من العنصر السابق.

تعرف المقبل القيم، وكيفية استخلاص المقبل ذلك؟ دعونا المشي من خلال عملية ملء مجموعة المقبلة المذكورة أعلاه:

كما هو مبين، وضعنا المتغيرين i و j، حيث كنت يمثل "الموضع التالي تم مطابقة البادئة"، وهو المراد شغلها السفلية مجموعة، يمثل ي موقف "قد تكون أطول مطابقة بادئة فرعية "وهذا هو المراد شغلها قيمة عنصر صفيف.

عند عدم وجود البادئة مطابقة، وهي أطول سلسلة فرعية بادئة مطابقة بالطبع لم يكن موجودا، لذلك أنا = 0، ي = 0، وهذا في المرة القادمة = 0.

وبعد ذلك، علينا أن جعل سلاسل فرعية طول بادئة مطابقة زائد 1:

في هذا الوقت، البادئة المتطابقة هي G، حيث يوجد حرف واحد فقط، ونفس لا يمكن تقديم أطول مطابقة بادئة فرعية، لذلك أنا = 1، ي = 0، بجانب 0.

وبعد ذلك، علينا أن ندع طول السلسلة الفرعية بادئة مطابقة استمر في إضافة 1:

في هذا الوقت، البادئات المتطابقة هي GT، نحن بحاجة للبدء إصدار حكم: لأن نمط سلسلة نمط بين  ! = نمط أن G! = T، أطول مطابقة بادئة فرعية قد لا يزال غير موجود.

حتى عندما = 2، ي لا يزال 0، بجانب = 0.

وبعد ذلك، علينا أن ندع طول السلسلة الفرعية بادئة مطابقة استمر لإضافة 1:

في هذا الوقت، البادئة المتطابقة هي GTG، ويرجع ذلك إلى نمط من بين سلسلة نمط  = نمط ، أي G = G، أطول مطابقة بادئة فرعية قد وقعت، هو G.

حتى عندما كنت = 3، ي = 1، بجانب = المقبل +1 = 1.

وبعد ذلك، علينا أن ندع طول السلسلة الفرعية بادئة مطابقة استمر لإضافة 1:

في هذا الوقت، وGTGT بادئة المتطابقة، يرجع إلى نمط من بين سلسلة نمط  = نمط ، أي T = T، ويمكن إضافة أطول مطابقة بادئة فرعية احد، هو GT.

لذلك، عندما = 4، ي = 2، بجانب = المقبل +1 = 2.

وبعد ذلك، علينا أن ندع طول السلسلة الفرعية بادئة مطابقة استمر لإضافة 1:

في هذا الوقت، وGTGTG بادئة المتطابقة، يرجع إلى نمط من بين سلسلة نمط  = نمط ، أي G = G، يمكن إضافة أطول مطابقة بادئة فرعية واحدة، هو GTG.

حتى عندما كنت = 5، ي = 3، بجانب = المقبل +1 = 3.

وبعد ذلك، علينا أن ندع طول السلسلة الفرعية بادئة مطابقة استمر لإضافة 1:

في هذا الوقت، وGTGTGC بادئة المتطابقة، فإنه تجدر الإشارة إلى أن الوقت الذي نمط سلسلة نمط  ! = نمط أن T! = C، وهذه المرة كيف نفعل ذلك؟

في هذا الوقت، وكنا غير قادر على أن تستمد من قيمة المقبل من القادم ، وC للشخصية سبق وكرر اثنين من سلاسل فرعية "GTG". حسنا، نحن لا يمكن وضع مشاكل في ذلك؟

ولعل الأصوات حول: يمكننا حساب "GTGTGC" مشكلة أطول بادئة مطابقة يمكن فرعية، الذي تحول إلى حساب "GTGC" قد تطابق أطول بادئة مشكلة سلاسل فرعية.

يتم تحويل هذه المشكلة، وهو ما يعادل الجزء الخلفي ي متغير إلى أخرى ، وهذا هو، ي = 1 الوضع (قيمة ط لم تتغير):

بعد التراجع، فإن الوضع لا يزال نمط  ! = نمط أن T! = C. ثم يمكننا وضع هذه القضية لا تزال تحويلها:

تحويل القضية مرة أخرى، أي ما يعادل وضع مرة أخرى إلى ي متغير المقبل ، وهذا هو، ي = 0 الوضع:

بعد التراجع، فإن الوضع لا يزال نمط  ! = نمط أن G! = C. ي لا يمكن العودة مرة أخرى، لذلك فإننا نستنتج ما يلي: عندما كنت = 6، ي = 0، بجانب = 0.

هذه هي اشتقاق المقبل عنصر صفيف.

1. تجهيزها سلسلة نمط، ومجموعة من الجيل القادم

2 في حلقة رئيسية، سلسلة الرئيسية اجتياز

2.1 مقارنة السلسلة الرئيسية ونمط سلسلة أحرف

2.2. إذا كان حرف سيئة، تحقيق مجموعة المقبلة، للحصول على المقابلة أطول مطابقة بادئة مطابقة بادئة فرعية قد نقل إلى سلسلة نمط موقف المقابلة

2.3. إذا المباريات طابع الحالية، تستمر الدورة

KMP خوارزمية لتحقيق محددة

  • // KMP خوارزمية المنطق الرئيسي. في شارع السلسلة الرئيسية، سلسلة النمط التخطيطي ساكنة العام كثافة تتمتع الشركة بميزة (سلسلة شارع، نمط سلسلة) { // المعالجة، الجيل القادم مجموعة الباحث التالي = getNexts (نمط)؛ ي كثافة العمليات = 0؛ // حلقة رئيسية، عابرا سلاسل الأحرف الرئيسية ل(كثافة العمليات ط = 0؛ ط <  str.length، وأنا ++) { بينما (ي >  0 && str.charAt (ط)! = Pattern.charAt (ي)) { // اجه الشخصيات سيئة، الاستعلام وتغيير صفيف سلسلة نمط بجانب نقطة البداية ي = المقبل . } إذا (str.charAt (ط) == pattern.charAt (ي)) { ي ++؛ } إذا (ي == pattern.length) { // مباراة العودة منخفض العودة ط - pattern.length + 1؛ } } العودة -1. } // الجيل التالي صفيف getNexts الخاص ثابت الباحث (نمط سلسلة) { الباحث التالي = كثافة العمليات الجديد . ي كثافة العمليات = 0؛ ل(كثافة العمليات ط = 2، وأنا < pattern.length، وأنا ++) { بينما (ي! = 0 && pattern.charAt (ي)! = pattern.charAt (ط-1)) { من // المقبل حل العودة إلى أخرى ي = المقبل . } إذا (pattern.charAt (ي) == pattern.charAt (ط-1)) { ي ++؛ } التالي  = J. } العودة المقبل. } ساكنة العام باطلة الرئيسية (سلسلة وسائط) { سلسلة شارع = "ATGTGAGCTGGTGTGTGCFAA". نمط سلسلة = "GTGTGCF". مؤشر كثافة العمليات = تتمتع الشركة بميزة (شارع، نمط)؛ System.out.println ( "ظهرت لأول مرة موقف:" + المؤشر)؛ }
  • CSS 12 قه نصائح للاهتمام تفتح للجمهور | برنامج القوة

    سيلينا التعادل جديلة يرتدي اللباس الوطني الرياح الرقص تحت الكرز على مهل

    وقال يي تشيان تيان ليانغ بابتسامة مثل عجينة غرامة احباط ضمادة على جانب الطريق

    تشانغ شين حصة صور الدعاية الأمريكية لانقاص وزنه لارتداء الوردي سترة جدا ضوء الشعر القصير حسب العمر

    الوباء العالمي في مرحلة حرجة منظمة الصحة العالمية: الآن هو أكبر خارج قلق الصين

    ما 18 Zhaizhen الوقاية كثيفة نسج شبكة macroreticular

    العد التنازلي مدخل 100 يوم! سحابة "المائة يوم أداء اليمين،" جامعة بكين وجامعة تسينغهوا والكليات الأخرى وترافق كنت السباق

    سيارة تويوتا مزدوجة وجوه: وضع RAV4 واليسارية، والحق وي اندا

    يعيش فضح المعرفة السيارات بقعة عمياء بيع، مبيعات السيارات الكاملة "روتينية"

    تطوير صافي أسعار السيارات الحمراء العصابات في الاعتبار: لا أقول قطعة سيئة من الهيب كوك كسر الرقص

    أبرد من المطر غائم والمزيد من الأسبوع القادم؟

    نوعين من السلطة، وثلاث مجموعات من الدفع الرباعي، والجديد وي اندا قوة الهندسة؟