Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SPO / LAB2_PAS / Lab2_SPO_PAS.doc
Скачиваний:
39
Добавлен:
26.03.2015
Размер:
169.47 Кб
Скачать

3.2. Основные алгоритмы поиска.

3.2.1. Прямой поиск строки.

Пусть задан массив S из n элементов и массив P из m элементов, причем 1 < m <= n. Поиск строки обнаруживает первое вхождение P в S.

i:=0;

repeat

i=i+1;

j=1;

 while (j<m) and (s[i+j]=p[j]) do

j=j+1;

until (j=m) or (i=n-m);

Этот алгоритм работает достаточно эффективно, если допустить, что несовпадение пары символов происходит после незначительного количества сравнений во внутреннем цикле.

3.2.2. Алгоритм Кнута, Мориса и Пратта (КМП-поиск) основывается на том, что после частичного совпадения начальной части слова с соответствующими символами текста фактически известна пройденная часть текста, и можно вычислить некоторые сведения (на основе самого слова), с помощью которых потом можно быстро продвинуться по тексту.

Поиск слова ABCABD показывает принцип работы такого алгоритма. При каждом несовпадении пары символов слово сдвигается на все пройденное расстояние, поскольку меньшие сдвиги не могут привести к полному совпадению.

Если j определяет позицию в слове, содержащую первый несовпадающий символ (как в алгоритме прямого поиска), то величина сдвига определяется как j - d. Значение d определяется как размер самой длинной последовательности символов слова, непосредственно предшествующих позиции j, которая полностью совпадает с началом слова. d зависит только от слова и не зависит от текста. Для каждого j будет своя величина d (dj). Так как величины dj зависят только от слова, то перед началом фактического поиска можно вычислить вспомогательную таблицу d; эти вычисления сводятся к некоторой предтрансляции слова.

3.2.3. Алгоритм Боуера и Мура (БМ-поиск) улучшает обработку самого плохого случая, но дает выигрыш в промежуточных ситуациях; основывается на сравнении символов, которые начинаются с конца слова, а не с начала. Как и в случае КМП-поиска, слово перед фактическим поиском трансформируется в некоторую таблицу.

Пусть для каждого символа x из алфавита величина dx – расстояние от самого правого в слове вхождения x до правого конца слова. Допустим, обнаружено расхождение между словом и текстом, тогда слово сразу можно сдвинуть вправо на число позиций, большее единицы. Если несовпадающий символ текста в слове вообще не встречается, то сдвиг становится даже больше, а именно сдвигать можно на длину всего слова.

В самых же благоприятных обстоятельствах, когда последний символ слова всегда попадает на несовпадающий символ текста, число сравнений равно n/m.

3.2.4. Бинарный поиск.

Символ S, который следует найти, сравнивается с элементом (n + 1)/2 в середине таблицы. Если этот элемент не является требуемым, необходимо просмотреть только блок элементов, пронумерованных от 1 до (n + 1)/2 – 1, или блок элементов от (n + 1)/2 + 1 до n в зависимости от того, искомый элемент S меньше или больше того элемента, с которым он сравнивается. Затем процесс повторяется над блоком меньшего размера.

3.3. Назначение и принципы организации таблиц идентификаторов.

Проверка правильности семантики и генерация кода требуют знания характеристик идентификаторов, используемых в программе на исходном языке. Эти характеристики выясняются из описаний и из того, как идентификаторы используются в программе и накапливаются в таблице символов (идентификаторов), которая состоит из набора полей, количество которых равно числу идентификаторов программы. Каждое поле содержит в себе полную информацию о данном элементе таблицы.

Под идентификаторами подразумеваются константы, переменные, имена процедур и функций, формальные и фактические параметры.

Простейший способ организации таблицы состоит в том, чтобы добавлять элементы в порядке их поступления. Поиск в этом случае требует сравнения с каждым элементом таблицы, пока не будет найден подходящий. Для таблицы, содержащей n элементов, в среднем будет выполнено n/2 сравнений. Если n – велико, то способ не является эффективным.

Поиск может быть выполнен более эффективно, если элементы таблицы упорядочены (отсортированы) согласно некоторому естественному порядку. В случае, где поиск осуществляется по имени идентификатора, наиболее естественным будет расположить элементы таблицы в алфавитном порядке. Эффективным методом поиска в упорядоченном списке из n элементов является бинарный поиск.

3.3.1. Абстрактные структуры данных предназначены для удобного хранения и доступа к информации. Они предоставляют удобный интерфейс для типичных операций с хранимыми объектами, скрывая детали реализации от пользователя, что удобно и позволяет добиться большей модульности программы.

Абстрактные структуры данных делят на две части:

  1. интерфейс – набор операций над объектами, который называют АТД – абстрактный тип данных;

  2. реализацию.

АТД-cловарь используется для манипулирования набором элементов, встроенных в линейном порядке; поддерживает динамическое редактирование элементов и различные формы поиска внутри набора (например, поиск заданного элемента, наименьшего или наибольшего элемента, предшественника или последователя данного элемента).

Для эффективного доступа словари организуются на основе упорядоченных структур данных. Если такого упорядочения нет, то оно вводится.

Если не нужна сортировка информации, а только быстрый доступ к ней – это случайное упорядочивание – хеширование, а один из наиболее эффективных способов реализации словаря является хеш-таблица.

3.3.2. Хеш-адресация – это часто используемый метод упорядочивания элементов в таблице; преобразует символ в индекс элемента в таблице, который получается хешированием символа, т. е. выполнением над символом некоторых простых арифметических и логических операций.

3.3.3. Коллизия – это случай, когда результаты хеширования двух или более разных элементов совпадают, т. е. двум или более идентификаторам соответствует одно и то же значение функции, а такие ключи (идентификаторы) называются ключами-синонимами. В одну позицию таблицы может быть помещен только один из конфликтующих элементов. Хорошая хеш-функция распределяет вычисляемые адреса равномерно на все имеющиеся в распоряжении адреса так, что коллизии возникают не слишком часто.

Соседние файлы в папке LAB2_PAS