Учитывая текстовую строку и строку шаблона, найдите все вхождения шаблона в строку.
Несколько алгоритмов поиска по шаблону ( KMP , Rabin-Karp , Naive Algorithm , Finite Automata ) уже обсуждались, которые можно использовать для этой проверки.
Здесь мы обсудим алгоритм на основе дерева суффиксов.
В 1 — й суффикса дерева Application ( Substring Check ), мы увидели , как проверить , является ли данный шаблон подстроки текста или нет. Рекомендуется пройти проверку подстроки 1 ст .
В этой статье мы пойдем немного дальше по той же проблеме. Если шаблон является подстрокой текста, то мы найдем все позиции шаблона в тексте.
В качестве предварительного условия мы должны знать, как построить дерево суффиксов тем или иным способом.
Здесь мы построим дерево суффиксов, используя алгоритм Укконена, который уже обсуждался ниже:
Построение суффикс-дерева Укконена — часть 1
Построение Суффикса Укконена — Часть 2
Построение Суффикса Укконена — Часть 3
Построение суффикс-дерева Укконена — часть 4
Построение Суффикса Укконена — Часть 5
Построение Суффикса Укконена — Часть 6
Давайте посмотрим на следующий рисунок:

Это дерево суффиксов для строки «abcabxabcd $», показывающее индексы суффиксов и индексы меток ребер (начало, конец). Значение (под) строки по краям показано только для пояснения. Мы никогда не храним строку метки пути в дереве.
Суффикс Индекс пути указывает индекс подстроки (начиная с корня) на этом пути.
Рассмотрим путь «bcd $» в вышеприведенном дереве с индексом 7. Он говорит, что подстроки b, bc, bcd, bcd $ находятся в индексе 7 в строке.
Аналогично, путь «bxabcd $» с суффиксным индексом 4 говорит о том, что подстроки b, bx, bxa, bxab, bxabc, bxabcd, bxabcd $ находятся в индексе 4.
Аналогично, путь «bcabxabcd $» с индексом суффикса 1 говорит о том, что подстроки b, bc, bca, bcab, bcabx, bcabxa, bcabxab, bcabxabc, bcabxabcd, bcabxabcd $ находятся в индексе 1.
Если мы увидим все три вышеупомянутых пути вместе, мы увидим, что:
- Подстрока «b» находится в индексах 1, 4 и 7
- Подстрока «bc» находится в индексах 1 и 7
С приведенным выше объяснением мы должны увидеть следующее:
- Подстрока «ab» находится в индексах 0, 3 и 6
- Подстрока «abc» находится в индексах 0 и 6
- Подстрока «с» находится в индексах 2 и 8
- Подстрока «xab» находится в индексе 5
- Подстрока «d» имеет индекс 9
- Подстрока «cd» находится в индексе 8
… ..
… ..
Можете ли вы увидеть, как найти все вхождения шаблона в строке?
- Прежде всего, проверьте, существует ли данный шаблон в строке или нет (как мы это делали в проверке подстроки ). Для этого пройдите дерево суффиксов к шаблону.
- Если вы нашли шаблон в дереве суффиксов (не упадите с дерева), просмотрите поддерево ниже этой точки и найдите все индексы суффиксов на листовых узлах. Все эти индексы-суффиксы будут индексами шаблона в строке
|
Выход:
Text: GEEKSFORGEEKS, Pattern to search: GEEKS Found at position: 8 Found at position: 0 substring count: 2 Pattern <GEEKS> is a Substring Text: GEEKSFORGEEKS, Pattern to search: GEEK1 Pattern <GEEK1> is NOT a Substring Text: GEEKSFORGEEKS, Pattern to search: FOR substring count: 1 and position: 5 Pattern <FOR> is a Substring Text: AABAACAADAABAAABAA, Pattern to search: AABA Found at position: 13 Found at position: 9 Found at position: 0 substring count: 3 Pattern <AABA> is a Substring Text: AABAACAADAABAAABAA, Pattern to search: AA Found at position: 16 Found at position: 12 Found at position: 13 Found at position: 9 Found at position: 0 Found at position: 3 Found at position: 6 substring count: 7 Pattern <AA> is a Substring Text: AABAACAADAABAAABAA, Pattern to search: AAE Pattern <AAE> is NOT a Substring Text: AAAAAAAAA, Pattern to search: AAAA Found at position: 5 Found at position: 4 Found at position: 3 Found at position: 2 Found at position: 1 Found at position: 0 substring count: 6 Pattern <AAAA> is a Substring Text: AAAAAAAAA, Pattern to search: AA Found at position: 7 Found at position: 6 Found at position: 5 Found at position: 4 Found at position: 3 Found at position: 2 Found at position: 1 Found at position: 0 substring count: 8 Pattern <AA> is a Substring Text: AAAAAAAAA, Pattern to search: A Found at position: 8 Found at position: 7 Found at position: 6 Found at position: 5 Found at position: 4 Found at position: 3 Found at position: 2 Found at position: 1 Found at position: 0 substring count: 9 Pattern <A> is a Substring Text: AAAAAAAAA, Pattern to search: AB Pattern <AB> is NOT a Substring
Построение дерева суффиксов Укконена требует O (N) времени и пространства для построения дерева суффиксов для строки длины N, и после этого для проверки подстроки требуется O (M) для шаблона длины M, а затем, если есть Z вхождений шаблон, это займет O (Z), чтобы найти индексы всех этих вхождений Z.
Общая сложность паттерна линейна: O (M + Z).
Немного более подробный анализ
Сколько внутренних узлов будет в дереве суффиксов строки длины N ??
Ответ: N-1 (почему ??)
Там будет N суффиксов в строке длиной N.
Каждый суффикс будет иметь один лист.
Таким образом, дерево суффиксов строки N будет иметь N листьев.
Поскольку у каждого внутреннего узла есть по крайней мере 2 дочерних элемента, дерево суффиксов из N-листьев имеет максимум N-1 внутренних узлов.
Если шаблон встречается Z раз в строке, это означает, что он будет частью суффикса Z, поэтому в точке (внутреннем узле и между ребрами) будет Z листьев, где сопоставление с шаблоном заканчивается в дереве, и поэтому поддерево с Z оставляет ниже этой точки. будет иметь внутренние узлы Z-1. Дерево с Z листьями можно пройти за O (Z).
Общая сложность паттерна линейна: O (M + Z).
Для данного шаблона Z (количество вхождений) может быть не более N.
Таким образом, сложность наихудшего случая может быть: O (M + N), если Z близко / равно N (обход дерева с N узлами занимает O (N) времени).
Последующие вопросы:
- Проверить, является ли шаблон префиксом текста?
- Проверить, является ли шаблон суффиксом текста?
Мы опубликовали следующие дополнительные статьи о приложениях дерева суффиксов:
- Приложение суффиксного дерева 1 — Проверка подстроки
- Приложение суффиксного дерева 3 — самая длинная повторяющаяся подстрока
- Suffix Tree Application 4 — построение линейного суффиксного массива времени
- Обобщенное дерево суффиксов 1
- Приложение суффиксного дерева 5 — самая длинная общая подстрока
- Приложение Suffix Tree 6 — длинная палиндромная подстрока
Эта статья предоставлена Анураг Сингх . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Suffix Tree Application 4 — построение линейного суффиксного массива времени
- Поиск по шаблону с использованием дерева суффиксов
- Приложение суффиксного дерева 1 — Проверка подстроки
- Приложение суффиксного дерева 3 — самая длинная повторяющаяся подстрока
- Приложение суффиксного дерева 5 — самая длинная общая подстрока
- Приложение Suffix Tree 6 — длинная палиндромная подстрока
- Обзор структур данных | Набор 3 (График, Три, Сегментное дерево и Суффикс-дерево)
- Обобщенное дерево суффиксов 1
- Построение суффикс-дерева Укконена — часть 4
- Построение Суффикса Укконена — Часть 3
- Построение суффикс-дерева Укконена — часть 1
- Построение Суффикса Укконена — Часть 2
- Построение Суффикса Укконена — Часть 5
- Построение Суффикса Укконена — Часть 6
- Суффикс Массив | Комплект 1 (Введение)
0.00 (0%) 0 votes