- •Аналіз алгоритмів
- •Алгоритм пошуку рядка
- •[Ред.]Постановка задачі
- •[Ред.]Термінологія
- •[Ред.]Лема про суфікси, що перекриваються
- •[Ред.]Базова класифікація алгоритмів
- •[Ред.]Алгоритми пошуку для одного зразка
- •[Ред.]Алгоритми пошуку скінченної множини зразків
- •[Ред.]Алгоритми пошуку необмеженої множини зразків
- •[Ред.]Інші класифікації
- •[Ред.]Індексуючі методи
- •[Ред.]Інші варіанти
- •Алгоритм сортування
- •[Ред.]Постановка задачі
- •[Ред.]Структури даних
- •[Ред.]Характеристики алгоритмів
- •[Ред.]Теорема про найкращий час сортування
- •[Ред.]Доведення
- •Рекурсивні функції та алгоритми
- •[Ред.]Властивість оптимальної підструктури
- •[Ред.]Коли алгоритми жадібного типу зазнають невдачі
- •[Ред.]Приклади [ред.]Розмін монет
- •[Ред.]Вибір заявок
- •Складність алгоритмів
[Ред.]Термінологія
—
множина
всіх рядкув скінченної довжини, утворенних
за допомогою символів алфавіту
. Порожній
рядок
також
належить
.
Довжина
рядка
позначається
як
. Конкатенація (об'єднання)
двох рядків
і
записується
як
,
її довжина відповідно дорівнює
.
Конкатенація складається з символів
рядка
після
яких записані символи рядка
.
Приклад:
Рядок
називається
префіксом рядка
(позначається
),
якщо
.
Якщо
,
то
.
Аналогічно,
рядок
називається
суфіксом рядка
(позначається
),
якщо
.
Пустий рядок є одночастно префіксом і суфіксом будь-якого рядка.
Відношення
і
є транзитивними.
[Ред.]Лема про суфікси, що перекриваються
Припустимо,
що
,
і
—
рядки, для яких виконується
співвідношення
і
.
Тоді, якщо
,
то
;
якщо
,
то
.
Якщо
,
то
.
Доведення: Всі три випадки розібрані на малюнку:
Позначимо
k-символьний префікс
зразка
через
.
Таким чином,
і
.
Аналогічно через
позначимо
k-символьний префікс тексту
.
За
допомогою цих позначень, задачу пошуку
рядка можна сформулювати, як задачу
виявлення всіх зсувів
,
таких що,
.
[Ред.]Базова класифікація алгоритмів
Різноманітні алгоритми розв'язання цієї задачі можна класифікувати за кількістю зразків, що обробляються одночасно. Крім того, алгоритми мають різну складність роботи. Окремо розглядається складність передобробки (передобробка здійснюється або тільки для тексту і не залежить від зразків, або ж тільки для зразків і не залежить від тексту), і складність самого пошуку.
[Ред.]Алгоритми пошуку для одного зразка
Алгоритм |
Складність передобробки |
Складність пошуку |
Примітивний алгоритм пошуку рядка |
0 (без передобробки) |
Θ(n m) |
Алгоритм Рабіна-Карпа |
Θ(m) |
в середньому Θ(n+m), в найгіршому випадку Θ(n m) |
Пошук за допомогоюскінченного автомата |
Θ(m |Σ|) |
Θ(n) |
Алгоритм Кнута-Моріса-Прата |
Θ(m) |
Θ(n) |
Алгоритм Бояра-Мура |
Θ(m + |Σ|) |
Ω(n/m), O(n) |
Бітап алгоритм |
Θ(m + |Σ|) |
Θ(n) |
[Ред.]Алгоритми пошуку скінченної множини зразків
Алгоритм Аха-Карасіка
Алгоритм Коменьця-Вальтера
Алгоритм Рабіна-Карпа
[Ред.]Алгоритми пошуку необмеженої множини зразків
Для пошуку зразків, що утворюють нескінченну (або дуже велику) множину, користуються формальними граматиками і регулярними виразами.
[Ред.]Інші класифікації
Класифікація, що бере наявність переобробки, за основний критерій:
Класи алгоритмів пошуку рядку |
||
|
Текст не передобробляється |
Текст передобробляється |
Зразки не передобробляються |
Елементарні алгоритми (англ. Elementary algorithms) |
Індексуючі методи (англ. Index methods) |
Зразки передобробляються |
Конструктивні пошукові системи (англ. Constructed search engines) |
Підписуючі методи (англ. Signature methods) |
[Ред.]Індексуючі методи
Швидкі алгоритми пошуку використовують передобробку тексту. Входження зразка може бути швидко знайдене, якщо для тексту побудувати індекс підрядків (наприклад, суфіксне дерево чи суфіксний масив). Так, суфіксне дерево можна побудувати за час Θ(n), а всі z входжень зразка можна знайти за час O(n + z) (якщо вважати, що розмір алфавіту — константа).
