Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочная информация по алгоритмам.doc
Скачиваний:
34
Добавлен:
20.06.2014
Размер:
399.87 Кб
Скачать

4.3. Последовательный поиск

Выполняется последовательное считывание записей массива, по каждой из которых принимается решение о выдачи в качестве результата в соответствии с аргументом поиска. Перед каждой процедурой считывания записи осуществляется проверка достижения конца массива. Среднее число операций сравнения – N/2 (N– объем массива). Если в информационный массив добавитьN+1 запись, удовлетворяющую критерию выдачи, то проверку на конец массива можно исключить, заменив ее проверкой после получения результата.

4.4. Ускоренные методы поиска

Ускоренные методы поиска применяются для упорядоченных массивов.

Метод исключения интервалов. К этой категории относят бинарный поиск, при котором массив делится пополам и отбрасывается часть массива, заведомо не содержащая требуемую запись. Методы дихотомии, при которых последовательность делится на равные части и метод Фибоначчи, в котором последовательность делится на интервалы в пропорции чисел Фибоначчи. Для бинарного поиска максимальное количество сравнений , минимальное – 1, в среднем –.

4.5. Блочный поиск

массив разбивается на равные блоки. В процессе поиска сравнение производится с последней записью блока. Если определяется, что запись содержится в блоке, поиск производится внутри блока. Рекомендуется в качестве числа блоков использовать . В этом случае количество сравнений в среднем равно. Бинарный и блочный поиски применяют к массивам с записями фиксированной длины. Блочный поиск лучше бинарного в плане расчета индекса следующей анализируемой записи. В блочном поиске каждый из блоков может быть поделен на подблоки, но использование более двух уровней делений нецелесообразно.

4.6. Поиск по двоичному дереву

Связанное хранение древовидных структур позволяет осуществить поиск в массивах с записями переменной длины. Поиск по дереву осуществляется в соответствии с принципами его формирования. Максимальное число сравнений равно количеству уровней дерева. Средние характеристики соответствуют бинарному поиску при наличии сбалансированного двоичного дерева.

4.7. Поиск с использованием прямого доступа к данным. Хеширование

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

4.8. Многоаспектный поиск

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

4.9. Справочники

Для ускорения поиска в массивах на ВЗУ используют общие, единые и основанные на структуре сбалансированного дерева справочники.

Общий справочник

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

Единый справочник

Основной массив упорядочивается по значению ключей, после чего делится на блоки. На каждый блок приходится одна статья, состоящая из поля ключа и поля указателя. Поле ключа содержит значение ключа последней записи блока, а поле указателя – адрес первой записи блока.

Справочник на основе сбалансированного дерева

Сбалансированным (Б-деревом) называется дерево, у которого количество уровней каждой из ветвей равно или отличается от соседнего на единицу.

Многоуровневый справочник строится по принципу наращивания сбалансированного дерева. Этот справочник называют индексом, а уровни справочника – уровнями индекса. Каждая вершина древовидного справочника представлена блоком из Nячеек памяти. В каждой ячейке размещается справочная запись, состоящая из поля ключа и поля указателя, связывающего каждую ячейку блока с порожденным блоком или с записью в основном массиве. Верхний уровень индекса делит весь информационный массив наNинтервалов. Каждый из интервалов делится наNподинтервалов. Количество уровней индекса определяется какот объема массива. Количество сравнений равно количеству уровней. Последняя ячейка каждого блока содержит значение ключа порожденной ячейки. Формирование справочника в зависимости от состояния текущего нижнего уровня производится следующим образом:

3 варианта

  1. В соответствующем блоке нижнего уровня индекса есть свободная ячейка. В этом случае новая запись содержащая ключ и указатель размещается этой ячейке, при этом записи упорядочиваются по возрастанию ключа.

  2. В нужном блоке нижнего уровня индекса отсутствует свободная ячейка. Записи нижнего уровня перемещаются в сторону ближней свободной ячейки другого блока. в освободившуюся ячейку добавляется новая запись, при этом корректируются по необходимости вышележащие уровни для сохранения правила о том, что значение ключа последней ячейки блок равно значению ключа порожденной ячейки.

  3. Индекс нижнего уровня заполнен полностью. Для включения в дерево новой справочной статьи выделяется область памяти и начинается формирование следующего уровня индекса. В последней ячейке вновь образованных блоков записываются значения ключей порожденных ячеек, а новая запись заносится в блок, наиболее подходящий по значению ключей.