Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

Глава 12. Последовательности и динамическое программирование

Худший случай для числа узлов trie происходит, когда никакие две последовательности не разделяют общий непустой префикс; то есть, за исключением корня, у всех внутренних узлов есть один ребенок.

trie T для набора S последовательностей может использоваться, чтобы осуществить словарь, ключи которого - ряды S. А именно, мы выполняем поиск в T для последовательности X, прослеживая вниз от корня путь, обозначенный знаками в X. Если этот путь может быть прослежен и заканчивается во внешнем узле, то мы знаем X, находится в словаре. Например, в trie в рисунке 12.9, прослеживая путь для «быка» заканчивается во внешнем узле. Если путь не может быть прослежен, или путь может быть прослежен, но заканчивается во внутреннем узле, то X не находится в словаре. В примере в рисунке 12.9 путь для «ставки» не может быть прослежен и путь для «быть» концами во внутреннем узле. Никакое такое слово не находится в словаре. Обратите внимание на то, что в этом внедрении словаря, единственные знаки сравнены вместо всей последовательности (ключ). Легко видеть, что продолжительность поиска последовательности размера m является O (dm), где d - размер алфавита. Действительно, мы посещаем в большей части m + 1 узел T, и мы тратим O (d) время в каждом узле. Для некоторых алфавитов мы можем быть в состоянии улучшить время, проведенное в узле, чтобы быть O (1), или O (зарегистрируйте d) при помощи словаря знаков, осуществленных в хеш-таблице или столе поиска. Однако, так как d - константа в большинстве заявлений, мы можем придерживаться простого подхода, который берет O (d) время за узел, который посещают.

Из обсуждения выше, из этого следует, что мы можем использовать trie, чтобы выполнить spe-cial тип соответствия образца, названного соответствием слова, где мы хотим определить, распознает ли данный образец одно из слов текста точно. (См. Фигу - ure 12.10.) Word, соответствующий, отличается от стандартного образца, соответствующего, так как образец не может соответствовать произвольной подстроке текста, но только одному из его слов. Используя trie, слово, соответствующее для образца длины m, берет O (dm) время, где d - размер алфавита, независимого от размера текста. Если у алфавита есть постоянный размер (как имеет место для текста на естественных языках и последовательностях ДНК), вопрос берет O (m) время, пропорциональное размеру образца. Простое расширение этой схемы поддерживает вопросы соответствия префикса. Однако произвольные случаи образца в тексте (например, образец - надлежащий суффикс слова или охватывает два слова), не может быть эффективно выполнен.

Чтобы построить стандарт trie для набора S последовательностей, мы можем использовать возрастающий алгоритм, который вставляет последовательности по одному. Вспомните предположение, что никакой ряд S не префикс другой последовательности. Чтобы вставить последовательность X в ток trie T, мы сначала пытаемся проследить путь, связанный с X в T. С тех пор X уже не находится в T, и никакая последовательность в S не префикс другой последовательности, мы прекращаем прослеживать путь во внутреннем узле v T прежде, чем достигнуть конца X. Мы тогда создаем новую цепь потомков узла v, чтобы сохранить остающиеся знаки X. Время, чтобы вставить X является O (dm), где m - длина X, и d - размер алфавита. Таким образом строя весь trie для набора S берет O (dn) время, где n - полная длина рядов S.