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

24.Ускоренный последовательный поиск

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

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

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

25.Двоичный поиск

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

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

Чтобы найти нужную запись в массиве в среднем требуется сравнений. В худшем случае

ПРИМЕР

t=10

2 4 6 8 10 12

[1] [2] [3] [4] [5] [6]

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

Блочный поиск состоит в том, что массив упорядоченный по возрастанию значений ключа записей, разбивается на определенное число блоков. Для поиска потребуется наименьшее время, если число блоков равно . Здесь - общее число записей в массиве. Число записей в блоке при этом также равно .

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

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

Для нахождения нужной записи требуется сравнений. В худшем случае сравнений. Худшим окажется тот случай, когда нужная запись оказывается в последнем блоке и занимает в нем первую позицию (при последовательном просмотре этого блока с конца) или последнюю позицию (при последовательном просмотре этого блока с начала). В массиве из 10 000 записей при этом потребуется 199 просмотров.

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

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