Алгоритм пошуку рядка Боєра — Мура, — ефективний алгоритм пошуку рядка, який є еталоном при практичних дослідженнях алгоритмів пошуку рядка. Був розроблений [en] і [en] у 1977 році. Перевага цього алгоритму в тому, що ціною деякої кількості попередніх обчислень над зразком або шаблоном (але не над рядком, в якому ведеться пошук) шаблон порівнюється з вихідним текстом не у всіх позиціях — частина перевірок пропускаються як такі, що не дадуть результату. Цей алгоритм швидко працює у ситуаціях коли зразок набагато коротший від тексту пошуку, або коли відбувається пошук в декількох документах. Зазвичай, чим довше зразок, тим швидше працює алгоритм.
Загальна оцінка обчислювальної складності алгоритму — O(|haystack|+|needle|+|Σ|) на неперіодичних шаблонах і O(|haystack|·|needle|+|Σ|) на періодичних, де haystack — рядок, в якому виконується пошук, needle — шаблон пошуку, Σ — алфавіт, на якому проводиться порівняння. У 1991 році Коул показав, що на неперіодичних шаблонах за повний прохід по рядку алгоритм зробить не більше 3·|haystack| порівнянь.
Опис алгоритму
Ця стаття є сирим з іншої мови. Можливо, вона створена за допомогою машинного перекладу або перекладачем, який недостатньо володіє обома мовами. (вересень 2017) |
Алгоритм заснований на трьох ідеях.
1. Сканування зліва направо, порівняння справа наліво. Поєднується початок тексту (рядки) і шаблону, перевірка починається з останнього символу шаблону. Якщо символи збігаються, проводиться порівняння передостаннього символу шаблону і т. д. Якщо всі символи шаблону збіглися з накладеними символами рядка, значить, підрядок знайдений, і пошук закінчено.
Якщо ж якийсь символ шаблону не збігається з відповідним символом рядка, шаблон зсувається на кілька символів вправо, і перевірка знову починається з останнього символу.
Ці «декілька», згадані в попередньому абзаці, обчислюються за двома евристиками.
2. Евристика стоп-символу. Припустимо, що ми проводимо пошук слова «колокол». Перша ж буква не збіглася — «к» (назвемо цю букву стоп-символом). Тоді можна зсунути шаблон вправо до останньої його букви «к».
Стрічка: * * * * * * к * * * * ** Шаблон: к о л о к о л Наступний крок: к о л о к о л
Якщо стоп-символу в шаблоні взагалі немає, шаблон зміщується за цей стоп-символ.
Стрічка: * * * * * а л * * * * * * * * Шаблон: к о л о к о л Наступний крок: к о л о к о л
В даному випадку стоп-символ — «а», і шаблон зсувається так, щоб він виявився прямо за цією буквою. В алгоритмі Боєра-Мура евристика стоп-символу взагалі не дивиться на співпавший суфікс (див. Нижче), так що перша буква шаблону («к») опиниться під «л», і буде проведена одна завідома холоста перевірка.
Якщо стоп-символ «к» опинився за іншою буквою «к», евристика стоп-символу не працює.
Стрічка: * * * * к к о л * * * * * Шаблон: к о л о к о л Наступний крок: к о л о к о л ?????
У таких ситуаціях виручає третя ідея АБМ — евристика співпавшого суфікса.
3. Евристика співпавшого суфікса. Якщо при порівнянні рядка і шаблону збіглося один або більше символів, шаблон зсувається в залежності від того, який суфікс збігся.
Стрічка: * * т о к о л * * * * * Шаблон: к о л о к о л Наступний крок: к о л о к о л
В даному випадку збігся суфікс «ок», і шаблон зсувається вправо до найближчого «окол». Якщо підрядка «окол» в шаблоні більше немає, але він починається на «кол», зрушується до «кол», і т. д.
Обидві евристики вимагають попередніх обчислень — залежно від шаблону пошуку заповнюються дві таблиці. Таблиця стоп-символів за розміром відповідає алфавіту (наприклад, якщо алфавіт складається з 256 символів, то її довжина 256); таблиця суфіксів — шуканому шаблону. Саме через це алгоритм Боєра-Мура не враховує співпавший суфікс і неспівпавший символ одночасно — це вимагало б занадто багато попередніх обчислень.
Опишемо докладніше обидві таблиці.
Таблиця стоп-символів
У таблиці стоп-символів вказується остання позиція в needle (виключаючи останню букву) кожного з символів алфавіту. Для всіх символів, що не увійшли вneedle
, пишемо 0 (для нумерації з 0 — відповідно, −1). Наприклад, якщо needle=«abcdadcd»
, таблиця стоп-символів буде виглядати так.
Символ a b c d [всі інші] Остання позиція 5 2 7 6 0
Зверніть увагу, для стоп-символу «d» остання позиція буде 6, а не 8 — остання буква не враховується. Це відома помилка, що приводить до неоптимальності. Для АБМ вона не фатальна («витягує» евристика суфікса), але фатальна для спрощеної версії АБМ — алгоритму Хорспула.
Якщо розбіжність сталася на позиції i
, а стоп-символ c
, то зсув буде i-StopTable[c]
.
Таблиця суфіксів
Для кожного можливого суфікса S шаблону needle вказати найменшу величину, на яку потрібно зрушити вправо шаблон, щоб він знову збігся з S. Якщо такий зсув неможливий, ставиться |needle| (в обох системах нумерації). Наприклад, для того жneedle=«abcdadcd»
буде:
Суфікс [пустий] d cd dcd ... abcdadcd Зсув 1 2 4 8 ... 8 Ілюстрація було ? ?d ?cd ?dcd ... abcdadcd стало abcdadcd abcdadcd abcdadcd abcdadcd ... abcdadcd
Якщо шаблон починається і закінчується однією і тією ж комбінацією букв, |needle| взагалі не з'явиться в таблиці. Наприклад, для needle=«колокол»
для всіх суфіксів (крім, звичайно, порожнього) зсув буде дорівнювати 4.
Суфікс [пустий] л ол ... олокол колокол Зсув 1 4 4 ... 4 4 Ілюстрація було ? ?л ?ол ... ?олокол колокол стало колокол колокол колокол ... колокол колокол
Існує швидкий алгоритм обчислення таблиці суфіксів. Цей алгоритм використовує префікс-функцію рядка.
m = length(needle) pi[] = префікс-функція(needle) pi1[] = префікс-функція(звернення(needle)) for j=0..m suffshift[j] = m - pi[m] for i=1..m j = m - pi1[i] suffshift[j] = min(suffshift[j], i - pi1[i])
Тут suffshift[0]
відповідає всій стрічці яка збіглася; suffshift[m]
— пустому суфіксу. Оскільки префікс-функція обчислюється за O(|needle|) операцій, обчислювальна складність цього кроку також дорівнює O(|needle|).
Приклад роботи алгоритму
Шуканий шаблон — «abbad»
. Таблиця стоп-символів буде виглядати як
Символ a b [інші] Позиція 4 3 0
Таблиця суфіксів для всіх можливих суфіксів (крім порожнього) дає максимальний зсув — 5.
abeccaabadbabbad abbad
Накладаємо зразок на рядок. Збіги суфікса немає — таблиця суфіксів дає зсув на одну позицію. Для символу вихідної стрічки, що не збігся, «с»
(5-а позиція) у таблиці стоп-символів записаний 0. Зсуваємо зразок вправо на 5-0=5
позицій.
abeccaabadbabbad abbad
Символи 3-5 збіглися, а другий — ні. Евристика стоп-символу для «а»
не працює (2-4=-2
). Але оскільки частина символів збіглася, у справу включається евристика суфікса, що збігся, який робить зсув шаблон відразу на п'ять позицій!
abeccaabadbabbad abbad
І знову збігу суфікса немає. Відповідно до таблиці стоп-символів зсуваємо зразок на 1 позицію і отримуємо шукане входження зразка:
abeccaabadbabbad abbad
Доведення коректності
Для доказу коректності алгоритму досить показати, що якщо та чи інша евристика пропонує стрибок більш ніж на одну позицію вправо, на припущенних позиціях шаблон не знайдеться.
Отже, нехай збігся суфікс S, needle=PbS
, стоп-символ — a (надалі малі літери — символи, великі — стрічки).
Стрічка: * * * * * * * a [-- S --] * * * * Шаблон: [--- P ---] b [-- S --]
Евристика стоп-символу. Працює, коли в стрічці S символ а відсутній. Якщо P=WaV і в стрічці V немає символу а, то евристика стоп-символу пропонує зрушення на |V|+1 позицію.
Стрічка: * * * * * * * * * * * * a [-- S --] * * * * * * * * Шаблон: [- W -] a [--- V ---] b [-- S --] Пропустити: [- W -] a [--- V ---] b [-- S --] Новий крок: [- W -] a [--- V ---] b [-- S --]
Дійсно, якщо в стрічці V немає букви a, нічого пробувати пропущенні |V| позиції.
Якщо ж в needle взагалі немає символу а, то евристика стоп-символу пропонує зсув на |P|+1 позицію — і також немає сенсу пробувати припущення |P|.
Стрічка: * * * * * * * * a [-- S --] * * * * * * * * Шаблон: [--- P ---] b [-- S --] Пропустити: [--- P ---] b [-- S --] Новий крок: [--- P ---] b [-- S --]
Евристика суфікса, який збігся. Сама неформальна фраза — «найменша величина, на яку потрібно зрушити вправо шаблон, щоб він знову збігся з S» — каже, що менші зрушення марні. Тому замість них покажемо коректність прискореного алгоритму обчислення таблиці суфіксів — тобто, продемонструємо, що він обчислює саме цей «мінімальний зсув».
Спочатку розглянемо перший цикл. pi(m) —це довжина максимального суфікса needle, який є префіксом. Тому m−pi(m) — максимальний зсув, який обумовлюється тим, що S та needle можуть перекриватися і частково; далі рухати неприпустимо.
Наприклад: навіть якщо весь шаблон «колокол»
збігся, далі 4 символів зсув неможливий — наприклад, у стрічці«колоколокол»
шаблон «колокол»
зустрічається двічі, на 1-й і на 5-й позиції.
haystack: колоколокол Спроба 1: колокол Спроба 2: колокол
Тепер розглянемо другий цикл — він відповідає повному перекриттю S та needle. Покажемо такий факт: якщо needle=P′SX=P′YS та інших входжень S в SX=YS немає, то в позиції, яка відповідає суфіксу S (тобто, m−|S|), буде записано рівно |X|=|Y|.
Попередня оцінка, пов'язана з частковим перекриттям S та needle, не менше |P|+1 і тому ролі не грає.
Розглянемо ітерацію i=|SX|=|YS|. Очевидно, що pi1(i) — це довжина максимального префікса-суфікса рядки SX=YS. Покажемо, що ця величина дорівнює саме |S|. Дійсно, якщо ця величина більше |S|, то стрічку SX=YS можливо розкласти так TV=WT, причому |T|>|S|. ОскількиYS=WT, то T=QS, и SX=QSV при порожніх рядках Q и V. Отримуємо третє входження стрічки S в SX, протиріччя. Звідси pi1(i)=|S|, значить, в позицію m−pi1(i)=m−|S| записується число i−pi1(i)=|SX|−|S|=|X|.
З'ясуємо, чи може на якийсь ітерації в цю комірку записатися менше число. При i1<i: з умови відсутності третього входження S не може бути pi1(i1)=pi1(i), а значить, j(i1)≠j(i). При i2>i: j(i2)=j(i) можливо, но в такому випадку в комірку буде записано |X|+i2−i, що більше |X|.
Порівняння з іншими алгоритмами
Переваги
Алгоритм Боєра-Мура на «хороших» даних дуже швидкий, а ймовірність появи «поганих» даних вкрай мала. Тому він оптимальний в більшості випадків, коли немає можливості провести попередню обробку тексту, в якому проводиться пошук (haystack). Хіба що на коротких текстах виграш не виправдовує попередніх обчислень.
На x86 існує гарна асемблерна реалізація АБМ, заснована на командах std; rep cmpsb
. Після невдалого порівняння в регістрі ecx
залишається індекс символу, якій збігся; вказівники esi
и edi
вказують на відповідні символи рядків needle та haystack.
Недоліки
Алгоритми сімейства Боєра-Мура не розширюються до приблизного пошуку, пошуку будь-якого рядка з декількох.
Порівняння не є «чорним скринею», тому при реалізації найбільш швидкого пошуку доводиться або розраховувати на вдалу роботу оптимізатора, або вручну оптимізувати пошук на асемблерному рівні.
Якщо текст змінюється рідко, а операцій пошуку проводиться багато (наприклад, пошукова машина), у тексті варто було б провести індексацію, після чого пошук можна буде виконувати в рази швидше, ніж навіть алгоритмом Боєра-Мура.
На великих алфавітах (наприклад, Юнікод) таблиця стоп-символів може займати багато пам'яті. У таких випадках або обходяться хеш-таблицями, або дроблять алфавіт, розглядаючи, наприклад, 4-байтовий символ як пару двобайтових.
На штучно підібраних «невдалих» текстах (наприклад, needle=«колоколоколоколоколокол») швидкість алгоритму Боєр-Мура серйозно знижується. Існують спроби поєднати притаманну алгоритмом Кнута-Морріса-Пратта ефективність у «поганих» випадках і швидкість Боєра-Мура в «хороших» — наприклад, турбо-алгоритм, зворотний алгоритм Колуссі та інші.
Примітки
- Hume; Sunday (November 1991). Fast String Searching. Software—Practice and Experience. 21 (11): 1221—1248.
- ; (October 1977). . Comm. ACM. New York, NY, USA: Association for Computing Machinery. 20 (10): 762—772. doi:10.1145/359842.359859. ISSN 0001-0782. Архів оригіналу за 16 лютого 2019. Процитовано 25 липня 2018.
- . Архів оригіналу за 4 лютого 2012. Процитовано 14 грудня 2015.
- (англ.). Архів оригіналу за 9 березня 2016.
Література
- Т. Кормен, Ч. Лейзерсон, Р. Ривест. Алгоритмы: построение и анализ. — М.: МЦНМО, 2000. . — с. 801. = T. Cormen, E. Leiserson, R. Rivest. Introduction to Algorithms. The MIT Press, 1990.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Algoritm poshuku ryadka Boyera Mura efektivnij algoritm poshuku ryadka yakij ye etalonom pri praktichnih doslidzhennyah algoritmiv poshuku ryadka Buv rozroblenij en i en u 1977 roci Perevaga cogo algoritmu v tomu sho cinoyu deyakoyi kilkosti poperednih obchislen nad zrazkom abo shablonom ale ne nad ryadkom v yakomu vedetsya poshuk shablon porivnyuyetsya z vihidnim tekstom ne u vsih poziciyah chastina perevirok propuskayutsya yak taki sho ne dadut rezultatu Cej algoritm shvidko pracyuye u situaciyah koli zrazok nabagato korotshij vid tekstu poshuku abo koli vidbuvayetsya poshuk v dekilkoh dokumentah Zazvichaj chim dovshe zrazok tim shvidshe pracyuye algoritm Zagalna ocinka obchislyuvalnoyi skladnosti algoritmu O haystack needle S na neperiodichnih shablonah i O haystack needle S na periodichnih de haystack ryadok v yakomu vikonuyetsya poshuk needle shablon poshuku S alfavit na yakomu provoditsya porivnyannya U 1991 roci Koul pokazav sho na neperiodichnih shablonah za povnij prohid po ryadku algoritm zrobit ne bilshe 3 haystack porivnyan Opis algoritmuCya stattya ye sirim perekladom z inshoyi movi Mozhlivo vona stvorena za dopomogoyu mashinnogo perekladu abo perekladachem yakij nedostatno volodiye oboma movami Bud laska dopomozhit polipshiti pereklad veresen 2017 Algoritm zasnovanij na troh ideyah 1 Skanuvannya zliva napravo porivnyannya sprava nalivo Poyednuyetsya pochatok tekstu ryadki i shablonu perevirka pochinayetsya z ostannogo simvolu shablonu Yaksho simvoli zbigayutsya provoditsya porivnyannya peredostannogo simvolu shablonu i t d Yaksho vsi simvoli shablonu zbiglisya z nakladenimi simvolami ryadka znachit pidryadok znajdenij i poshuk zakincheno Yaksho zh yakijs simvol shablonu ne zbigayetsya z vidpovidnim simvolom ryadka shablon zsuvayetsya na kilkasimvoliv vpravo i perevirka znovu pochinayetsya z ostannogo simvolu Ci dekilka zgadani v poperednomu abzaci obchislyuyutsya za dvoma evristikami 2 Evristika stop simvolu Pripustimo sho mi provodimo poshuk slova kolokol Persha zh bukva ne zbiglasya k nazvemo cyu bukvu stop simvolom Todi mozhna zsunuti shablon vpravo do ostannoyi jogo bukvi k Strichka k Shablon k o l o k o l Nastupnij krok k o l o k o l Yaksho stop simvolu v shabloni vzagali nemaye shablon zmishuyetsya za cej stop simvol Strichka a l Shablon k o l o k o l Nastupnij krok k o l o k o l V danomu vipadku stop simvol a i shablon zsuvayetsya tak shob vin viyavivsya pryamo za ciyeyu bukvoyu V algoritmi Boyera Mura evristika stop simvolu vzagali ne divitsya na spivpavshij sufiks div Nizhche tak sho persha bukva shablonu k opinitsya pid l i bude provedena odna zavidoma holosta perevirka Yaksho stop simvol k opinivsya za inshoyu bukvoyu k evristika stop simvolu ne pracyuye Strichka k k o l Shablon k o l o k o l Nastupnij krok k o l o k o l U takih situaciyah viruchaye tretya ideya ABM evristika spivpavshogo sufiksa 3 Evristika spivpavshogo sufiksa Yaksho pri porivnyanni ryadka i shablonu zbiglosya odin abo bilshe simvoliv shablon zsuvayetsya v zalezhnosti vid togo yakij sufiks zbigsya Strichka t o k o l Shablon k o l o k o l Nastupnij krok k o l o k o l V danomu vipadku zbigsya sufiks ok i shablon zsuvayetsya vpravo do najblizhchogo okol Yaksho pidryadka okol v shabloni bilshe nemaye ale vin pochinayetsya na kol zrushuyetsya do kol i t d Obidvi evristiki vimagayut poperednih obchislen zalezhno vid shablonu poshuku zapovnyuyutsya dvi tablici Tablicya stop simvoliv za rozmirom vidpovidaye alfavitu napriklad yaksho alfavit skladayetsya z 256 simvoliv to yiyi dovzhina 256 tablicya sufiksiv shukanomu shablonu Same cherez ce algoritm Boyera Mura ne vrahovuye spivpavshij sufiks i nespivpavshij simvol odnochasno ce vimagalo b zanadto bagato poperednih obchislen Opishemo dokladnishe obidvi tablici Tablicya stop simvoliv U tablici stop simvoliv vkazuyetsya ostannya poziciya v needle viklyuchayuchi ostannyu bukvu kozhnogo z simvoliv alfavitu Dlya vsih simvoliv sho ne uvijshli vneedle pishemo 0 dlya numeraciyi z 0 vidpovidno 1 Napriklad yaksho needle abcdadcd tablicya stop simvoliv bude viglyadati tak Simvol a b c d vsi inshi Ostannya poziciya 5 2 7 6 0 Zvernit uvagu dlya stop simvolu d ostannya poziciya bude 6 a ne 8 ostannya bukva ne vrahovuyetsya Ce vidoma pomilka sho privodit do neoptimalnosti Dlya ABM vona ne fatalna vityaguye evristika sufiksa ale fatalna dlya sproshenoyi versiyi ABM algoritmu Horspula Yaksho rozbizhnist stalasya na poziciyi i a stop simvol c to zsuv bude i StopTable c Tablicya sufiksiv Dlya kozhnogo mozhlivogo sufiksa S shablonu needle vkazati najmenshu velichinu na yaku potribno zrushiti vpravo shablon shob vin znovu zbigsya z S Yaksho takij zsuv nemozhlivij stavitsya needle v oboh sistemah numeraciyi Napriklad dlya togo zhneedle abcdadcd bude Sufiks pustij d cd dcd abcdadcd Zsuv 1 2 4 8 8 Ilyustraciya bulo d cd dcd abcdadcd stalo abcdadcd abcdadcd abcdadcd abcdadcd abcdadcd Yaksho shablon pochinayetsya i zakinchuyetsya odniyeyu i tiyeyu zh kombinaciyeyu bukv needle vzagali ne z yavitsya v tablici Napriklad dlya needle kolokol dlya vsih sufiksiv krim zvichajno porozhnogo zsuv bude dorivnyuvati 4 Sufiks pustij l ol olokol kolokol Zsuv 1 4 4 4 4 Ilyustraciya bulo l ol olokol kolokol stalo kolokol kolokol kolokol kolokol kolokol Isnuye shvidkij algoritm obchislennya tablici sufiksiv Cej algoritm vikoristovuye prefiks funkciyu ryadka m length needle pi prefiks funkciya needle pi1 prefiks funkciya zvernennya needle for j 0 m suffshift j m pi m for i 1 m j m pi1 i suffshift j min suffshift j i pi1 i Tut suffshift 0 vidpovidaye vsij strichci yaka zbiglasya suffshift m pustomu sufiksu Oskilki prefiks funkciya obchislyuyetsya za O needle operacij obchislyuvalna skladnist cogo kroku takozh dorivnyuye O needle Priklad roboti algoritmuShukanij shablon abbad Tablicya stop simvoliv bude viglyadati yak Simvol a b inshi Poziciya 4 3 0 Tablicya sufiksiv dlya vsih mozhlivih sufiksiv krim porozhnogo daye maksimalnij zsuv 5 abeccaabadbabbad abbad Nakladayemo zrazok na ryadok Zbigi sufiksa nemaye tablicya sufiksiv daye zsuv na odnu poziciyu Dlya simvolu vihidnoyi strichki sho ne zbigsya s 5 a poziciya u tablici stop simvoliv zapisanij 0 Zsuvayemo zrazok vpravo na 5 0 5 pozicij abeccaabadbabbad abbad Simvoli 3 5 zbiglisya a drugij ni Evristika stop simvolu dlya a ne pracyuye 2 4 2 Ale oskilki chastina simvoliv zbiglasya u spravu vklyuchayetsya evristika sufiksa sho zbigsya yakij robit zsuv shablon vidrazu na p yat pozicij abeccaabadbabbad abbad I znovu zbigu sufiksa nemaye Vidpovidno do tablici stop simvoliv zsuvayemo zrazok na 1 poziciyu i otrimuyemo shukane vhodzhennya zrazka abeccaabadbabbad abbadDovedennya korektnostiDlya dokazu korektnosti algoritmu dosit pokazati sho yaksho ta chi insha evristika proponuye stribok bilsh nizh na odnu poziciyu vpravo na pripushennih poziciyah shablon ne znajdetsya Otzhe nehaj zbigsya sufiks S needle PbS stop simvol a nadali mali literi simvoli veliki strichki Strichka a S Shablon P b S Evristika stop simvolu Pracyuye koli v strichci S simvol a vidsutnij Yaksho P WaV i v strichci V nemaye simvolu a to evristika stop simvolu proponuye zrushennya na V 1 poziciyu Strichka a S Shablon W a V b S Propustiti W a V b S Novij krok W a V b S Dijsno yaksho v strichci V nemaye bukvi a nichogo probuvati propushenni V poziciyi Yaksho zh v needle vzagali nemaye simvolu a to evristika stop simvolu proponuye zsuv na P 1 poziciyu i takozh nemaye sensu probuvati pripushennya P Strichka a S Shablon P b S Propustiti P b S Novij krok P b S Evristika sufiksa yakij zbigsya Sama neformalna fraza najmensha velichina na yaku potribno zrushiti vpravo shablon shob vin znovu zbigsya z S kazhe sho menshi zrushennya marni Tomu zamist nih pokazhemo korektnist priskorenogo algoritmu obchislennya tablici sufiksiv tobto prodemonstruyemo sho vin obchislyuye same cej minimalnij zsuv Spochatku rozglyanemo pershij cikl pi m ce dovzhina maksimalnogo sufiksa needle yakij ye prefiksom Tomu m pi m maksimalnij zsuv yakij obumovlyuyetsya tim sho S ta needle mozhut perekrivatisya i chastkovo dali ruhati nepripustimo Napriklad navit yaksho ves shablon kolokol zbigsya dali 4 simvoliv zsuv nemozhlivij napriklad u strichci kolokolokol shablon kolokol zustrichayetsya dvichi na 1 j i na 5 j poziciyi haystack kolokolokol Sproba 1 kolokol Sproba 2 kolokol Teper rozglyanemo drugij cikl vin vidpovidaye povnomu perekrittyu S ta needle Pokazhemo takij fakt yaksho needle P SX P YS ta inshih vhodzhen S v SX YS nemaye to v poziciyi yaka vidpovidaye sufiksu S tobto m S bude zapisano rivno X Y Poperednya ocinka pov yazana z chastkovim perekrittyam S ta needle ne menshe P 1 i tomu roli ne graye Rozglyanemo iteraciyu i SX YS Ochevidno sho pi1 i ce dovzhina maksimalnogo prefiksa sufiksa ryadki SX YS Pokazhemo sho cya velichina dorivnyuye same S Dijsno yaksho cya velichina bilshe S to strichku SX YS mozhlivo rozklasti tak TV WT prichomu T gt S OskilkiYS WT to T QS i SX QSV pri porozhnih ryadkah Q i V Otrimuyemo tretye vhodzhennya strichki S v SX protirichchya Zvidsi pi1 i S znachit v poziciyu m pi1 i m S zapisuyetsya chislo i pi1 i SX S X Z yasuyemo chi mozhe na yakijs iteraciyi v cyu komirku zapisatisya menshe chislo Pri i1 lt i z umovi vidsutnosti tretogo vhodzhennya S ne mozhe buti pi1 i1 pi1 i a znachit j i1 j i Pri i2 gt i j i2 j i mozhlivo no v takomu vipadku v komirku bude zapisano X i2 i sho bilshe X Porivnyannya z inshimi algoritmamiPerevagi Algoritm Boyera Mura na horoshih danih duzhe shvidkij a jmovirnist poyavi poganih danih vkraj mala Tomu vin optimalnij v bilshosti vipadkiv koli nemaye mozhlivosti provesti poperednyu obrobku tekstu v yakomu provoditsya poshuk haystack Hiba sho na korotkih tekstah vigrash ne vipravdovuye poperednih obchislen Na x86 isnuye garna asemblerna realizaciya ABM zasnovana na komandah std rep cmpsb Pislya nevdalogo porivnyannya v registri ecx zalishayetsya indeks simvolu yakij zbigsya vkazivniki esi i edi vkazuyut na vidpovidni simvoli ryadkiv needle ta haystack Nedoliki Algoritmi simejstva Boyera Mura ne rozshiryuyutsya do pribliznogo poshuku poshuku bud yakogo ryadka z dekilkoh Porivnyannya ne ye chornim skrineyu tomu pri realizaciyi najbilsh shvidkogo poshuku dovoditsya abo rozrahovuvati na vdalu robotu optimizatora abo vruchnu optimizuvati poshuk na asemblernomu rivni Yaksho tekst zminyuyetsya ridko a operacij poshuku provoditsya bagato napriklad poshukova mashina u teksti varto bulo b provesti indeksaciyu pislya chogo poshuk mozhna bude vikonuvati v razi shvidshe nizh navit algoritmom Boyera Mura Na velikih alfavitah napriklad Yunikod tablicya stop simvoliv mozhe zajmati bagato pam yati U takih vipadkah abo obhodyatsya hesh tablicyami abo droblyat alfavit rozglyadayuchi napriklad 4 bajtovij simvol yak paru dvobajtovih Na shtuchno pidibranih nevdalih tekstah napriklad needle kolokolokolokolokolokol shvidkist algoritmu Boyer Mura serjozno znizhuyetsya Isnuyut sprobi poyednati pritamannu algoritmom Knuta Morrisa Pratta efektivnist u poganih vipadkah i shvidkist Boyera Mura v horoshih napriklad turbo algoritm zvorotnij algoritm Kolussi ta inshi PrimitkiHume Sunday November 1991 Fast String Searching Software Practice and Experience 21 11 1221 1248 October 1977 Comm ACM New York NY USA Association for Computing Machinery 20 10 762 772 doi 10 1145 359842 359859 ISSN 0001 0782 Arhiv originalu za 16 lyutogo 2019 Procitovano 25 lipnya 2018 Arhiv originalu za 4 lyutogo 2012 Procitovano 14 grudnya 2015 angl Arhiv originalu za 9 bereznya 2016 LiteraturaT Kormen Ch Lejzerson R Rivest Algoritmy postroenie i analiz M MCNMO 2000 ISBN 5 900916 37 5 s 801 T Cormen E Leiserson R Rivest Introduction to Algorithms The MIT Press 1990