Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OTVET_OAIP.docx
Скачиваний:
22
Добавлен:
27.09.2019
Размер:
589.57 Кб
Скачать

44. Задача поиска подстрок, простейший алгоритм.

Одна из важнейших задач поиска информации — поиск точно заданной подстроки в строке. Тем не менее, эта задача чрезвычайно важна — она применяется в текстовых редакторах, поисковых машинах и т.д.

На сегодняшний день существует огромное разнообразие алгоритмов поиска подстроки.

Простейший алгоритм заключается в проверке всех позиций текста с 0 по n - m на предмет совпадения с началом образца. Если совпадает - смотрим следующую букву и т.д.

45. Задача поиска подстрок. Алгоритм Хорспула. Алгоритм Карпа-Рабина. Одна из важнейших задач поиска информации — поиск точно заданной подстроки в строке. Тем не менее, эта задача чрезвычайно важна — она применяется в текстовых редакторах, поисковых машинах и тд..

На сегодняшний день существует огромное разнообразие алгоритмов поиска подстроки. Алгоритм Бойера — Мура — Хорспула поиска строки — упрощённый вариант Алгоритма Бойера — Мура. АБМХ работает лучше алгоритма Бойера — Мура на случайных текстах. К тому же, требующая многих предварительных вычислений эвристика совпавшего суффикса опускается. Описание алгоритма: Сначала строится таблица смещений для искомого шаблона. Совмещается начало текста (строки) и шаблона, проверка начинается с последнего символа шаблона. Если последний символ шаблона и соответствующий ему при наложении символ строки не совпадают, то образец сдвигается относительно строки на величину, полученную из таблицы смещений. Причём символ берется из строки (а не из шаблона), соответствующий сдвиг находится в таблице. Производится сдвиг и снова начинается проверка с последнего символа. Если же символы совпадают, производится сравнение предпоследнего символа шаблона и т. д. Если все символы шаблона совпали с наложенными символами строки, значит, подстрока найдена, и поиск окончен. Если же какой-то (не последний) символ шаблона не совпадает с соответствующим символом строки, шаблон сдвигается на один символ вправо, и проверка снова начинается с последнего символа. Весь алгоритм выполняется до тех пор, пока либо не будет найдено вхождение искомого образца, либо не будет достигнут конец строки. Алгоритм Рабина — Карпа — это алгоритм поиска строки, который ищет шаблон, то есть подстроку, в тексте используя хеширование. 

Алгоритм редко используется для поиска одиночного шаблона, но имеет значительную теоретическую важность и очень эффективен в поиске совпадений множественных шаблонов. Для текста длины n и шаблона длины m, его среднее время исполнения и лучшее время исполнения это О(n), но в худшем случае он имеет производительность O(nm), что является одной из причин того, почему он не слишком широко используется. Однако, алгоритм имеет уникальную особенность находить любую из k строк менее, чем за время O(n) в среднем, независимо от размера k. Одно из простейших практических применений алгоритма Рабина — Карпа состоит в определении плагиата.  Поскольку количество строк, которые мы ищем, k, очень большое, обычные алгоритмы поиска одиночных строк становятся неэффективными. Основной проблемой алгоритма является нахождение постоянной строки длины m, называемой образцом, в тексте длины n. Один из простейших алгоритмов для этой задачи просто ищет подстроку во всех возможных местах:Этот алгоритм хорошо работает во многих практических случаях, но совершенно не эффективен например на поиске строки из 10000 "a", за которыми следует "b" в строке из 10 миллионов букв "a". В этом случае он показывает своё худшее время исполнения О(mn).

46. Задача поиска подстрок. Алгоритм Бойера-Мура. Алгоритм Кнута-Морриса-Пратта. 1ый вопрос см. 45. Алгоритм поиска строки Бойера — Мура считается наиболее быстрым среди алгоритмов общего назначения, предназначенных для поиска подстроки в строке. Преимущество этого алгоритма в том, что ценой некоторого количества предварительных вычислений над шаблоном (но не над строкой, в которой ведётся поиск) шаблон сравнивается с исходным текстом не во всех позициях — часть проверок пропускаются как заведомо не дающие результата. Алгоритм основан на трех идеях: 1. Сканирование слева направо, сравнение справа налево. Совмещается начало текста (строки) и шаблона, проверка начинается с последнего символа шаблона. Если символы совпадают, производится сравнение предпоследнего символа шаблона и т. д. Если все символы шаблона совпали с наложенными символами строки, значит, подстрока найдена, и поиск окончен. Если же какой-то символ шаблона не совпадает с соответствующим символом строки, шаблон сдвигается на несколько символов вправо, и проверка снова начинается с последнего символа. 2. Эвристика стоп-символа. Предположим, что мы производим поиск слова «колокол». Первая же буква не совпала — «к» (назовём эту букву стоп-символом). Тогда можно сдвинуть шаблон вправо до последней буквы «к».Если стоп-символа в шаблоне вообще нет, шаблон смещается за этот стоп-символ. В данном случае стоп-символ — «а», и шаблон сдвигается так, чтобы он оказался прямо за этой буквой. В алгоритме Бойера-Мура эвристика стоп-символа вообще не смотрит на совпавший суффикс (см. ниже), так что первая буква шаблона («к») окажется под «л», и будет проведена одна заведомо холостая проверка. Если стоп-символ «к» оказался за другой буквой «к», эвристика стоп-символа не работает. 3. Эвристика совпавшего суффикса. Если при сравнении строки и шаблона совпало один или больше символов, шаблон сдвигается в зависимости от того, какой суффикс совпал. В данном случае совпал суффикс «окол», и шаблон сдвигается вправо до ближайшего «окол». Если подстроки «окол» в шаблоне больше нет, но он начинается на «кол», сдвигается до «кол», и т. д. Алгоритм Кнута — Морриса — Пратта — алгоритм поиска образца (подстроки) в строке. Поставим следующую задачу: имеется образец   и строка  , и нужно определить индекс, начиная с которого строка   содержится в строке  . Если   не содержится в   — вернуть индекс, который не может быть интерпретирован как позиция в строке (например, отрицательное число). При необходимости отслеживать каждое вхождение образца в текст имеет смысл завести дополнительную функцию, вызываемую при каждом обнаружении образца.

Описание алгоритма и оценка времени работы. Рассмотрим сравнение строк на позиции  , где образец   сопоставляется с частью текста  . Предположим, что первое несовпадение произошло между   и  , где  . Тогда  и . При сдвиге вполне можно ожидать, что префикс (начальные символы) образца   сойдется с каким-нибудь суффиксом (конечные символы) текста  . Длина наиболее длинного префикса, являющегося одновременно суффиксом, есть префикс-функция от строки   для индекса  .

Это приводит нас к следующему алгоритму: пусть   — префикс-функция от строки   для индекса  . Тогда после сдвига мы можем возобновить сравнения с места   и   без потери возможного местонахождения образца. Средствами амортизационного анализа можно показать, что таблица   может быть вычислена за   сравнений перед началом поиска. А поскольку строка   будет пройдена ровно один раз, суммарное время работы алгоритма будет равно  , где   - длина текста  .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]