
- •Анотація
- •1. Теоретичні відомості про алгоритми пошуку підстрічки в стрічці
- •1.1. Основні поняття.
- •1.1.1 Стрічка, її довжина, підстрічка.
- •1.1.2. Поняття про складність алгоритму.
- •1.2. Алгоритми основані на методі послідовного пошуку.
- •1.2.1. Алгоритм послідовного (прямого) пошуку (The Brute Force Algorithm).
- •1.2.2. Алгоритм Рабіна.
- •1.3. Алгоритм Кнута - Моріса - Прата (кмп).
- •1.4. Алгоритм Бойера – Мура і деякі його модифікації.
- •1.4.1. Алгоритм Бойера – Мура.
- •1.4.2. Модификації бм. Швидкий пошук (Класифікація Thierry Lecroq ).
- •Турбо бм (Класифікація Thierry Lecroq ).
- •1.5. Пошук підстрічок з допомогою скінченного автомата.
- •1.5.1. Структура автомата.
- •1.5.2. Приклад побудови скінченного автомата
- •2. Експериментальний аналіз алгоритмів
- •2.1. Суть експерименту.
- •2.2. Результати і аналіз експерименту.
- •3. Програмна реалізація
- •Висновок.
- •Література.
1.4.2. Модификації бм. Швидкий пошук (Класифікація Thierry Lecroq ).
Зсув поганого символу, який використовується в алгоритмі Бойера - Мура, не дуже ефективний для маленького алфавіту, але, коли розмір алфавіту великий порівняно з довжиною зразка, як це часто буває у випадку з таблицею ASCII і при звичайному пошуку в текстовому редакторі, він стає надзвичайно корисний. Використання в алгоритмів тільки його одного може бути досить ефективним.
Після спроби співставлення x і y [i, i+m-1], довжина зсуву - не менше 1. Таким чином, символ y[i+m] обов'язково буде залучений в наступну спробу, а отже, може бути використаний у поточній спробі для зсуву «поганого» символу. Модифікуємо функцію «поганого» символу, щоб прийняти до уваги останній символ х:
bc[ a ] = min { j | 0
j
m і
x[ m - 1 - j ] = a }, якщо
a зустрічається
в x,
bc[ a ] = m в протилежному випадку.
Порівняння тексту і зразка можуть здійснюватися в будь-якому порядку.
Турбо бм (Класифікація Thierry Lecroq ).
Турбо БМ також є поліпшенням алгоритму Бойера - Мура. Ми будемо запам'ятовувати сегмент тексту, який зійшовся з суфіксом зразка під час минулої спроби (і тільки тоді, коли стався зсув «гарного» суфікса).
Це дасть нам дві переваги:
1. Можливість перескочити через цей сегмент
2. Можливість застосування «турбо – зсуву»
«Турбо – зсув» може статися, якщо ми виявимо, що суфікс зразка, який збігається з текстом, коротше, ніж той, який був запам’ятований раніше.
Нехай u - запам’ятовуваний сегмент, а v - cуффікс, який співпав під час поточної спроби, такий що uzv - суфікс x. Тоді av - суфікс x, два символи а i b зустрічаються на відстані p в тексті, і суфікс x довжини |uzv| має період довжиною p, а отже, не може перекрити обидва символи а i b в тексті. Найменший можливий зсув має довжину |u| - |v| (його ми і називаємо «турбо - зсувом»).
1.5. Пошук підстрічок з допомогою скінченного автомата.
1.5.1. Структура автомата.
За визначенням,
скінченний
автомат являє собою п'ятірку
М=(Q, q0,
A,
,
),
де:
Q — скінченна множина станів;
q0
Q
— початковий
стан;
А Q — скінченна множина заключних станів;
— скінченний вхідний алфавіт;
— функція
Q х
Q, є
функцієй
переходів
автомата.
На початку
роботи
скінченний
автомат
знаходится
в стані
q0.
Потім
він
по черзі
читає
символи
із
вхідної
стрічки.
Знаходячись
в стані
q і
зчитуючи
символ а, автомат переходить
в стан
(q,a).
Якщо
автомат знаходиться
в стані
q
A
говорять,
що
він
допускає
прочитану частину
вхідної
стрічки.
Якщо
ж q
А, то прочитана частина
стрічки
і
зразок для пошуку не співпадають.
Із
заключним
станом
М зв’язана
функція
,
що
називається
функцією
заключного
стану,
котра
визначається
наступним
чином:
є
стан,
в котрий
прийде
автомат (з початкового
стану),
прочитавши
стрічку
w.
Автомат допускає стрічку
w
тоді і тільки тоді, коли
А
Для кожного зразка Р можна побудувати кінцевий автомат, який шукає цей зразок у тексті. Першим кроком у побудові автомата, що відповідає стрічці-зразку Р[1 .. m], є побудова за Р допоміжної суфікс-функції (як в алгоритмі КМП). Тепер визначимо кінцевий автомат, що відповідає зразку Р[1 .. m], наступним чином:
Його множина станів Q = {0,1,..., m}. Початковий стан q0 = 0.
Функція переходів опреділена відношенням (q — стан,
— символ): (q,a) =
(Pqa). (1)
Пояснимо це відношення. Треба сконструювати автомат таким чином, щоб при його дії на стрічку Т відношення
(Тi)
=
(Тi)
було інваріантом (тоді рівність (Тi) = m буде рівносильна тому, що Р входить в Т із зсувом i — m, і автомат тим самим знайде всі допустимі зсуви). Однак у цьому випадку обчислення переходу по формулі (1) необхідно для підтримки істинності інваріанти, що випливає з теорем, наведених нижче.
Теорема. Нехай q = (х), де х — стрічка. Тоді для будь-якого символа а має місце рівність (ха) = (Pqa).
Теорема. Нехай — функція заключного стану для пошуку підстрічки Р[1.. m]. Якщо Т[1.. n] — довільний текст, то (Тi) = (Тi) для i=0,1,..., n.
З вищенаведеного випливає, що завдання пошуку підстрічки складається з двох частин:
побудова автомата за зразком (визначення функції переходів для заданого зразка);
застосування цього автомата для пошуку вхідного зразка в заданому тексті.