Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ в программировании. Справочник.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.29 Mб
Скачать

11 Поиск

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

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

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

    1. Алгоритмы последовательного поиска

«Начни с начала и продвигайся, пока не найдёшь нужный ключ; тогда остановись». Такая последовательная процедура является очевидным способом поиска; удобно начать наши рассмотрения с неё, так как на ней основаны многие более сложные алгоритмы. Несмотря на свою простоту, последовательный поиск содержит ряд очень интересных идей.

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

Алгоритм S. (Последовательный поиск.) Имеется таблица записей R1,R2,...,Rn, снабженных соответственно ключами K1,K2,...,Kn. Алгоритм предназначен для поиска записи с данным ключом K. Предполагается, что N≥ 1.

S1. Установить i ≤1.

S2. Если K=Ki, алгоритм оканчивается удачно.

S3. Если K<>Ki, увеличить i на 1.

S4. Если i<=N, то вернутся к шагу S2. В противном случае алгоритм оканчивается неудачно.

Алгоритм Q. (Быстрый последовательный поиск.) В отличие от алгоритма здесь ещё предполагается, что в конце файла стоит фиктивная Rn+1 запись.

Q1. Установить i <=1, Kn+1<=K.

Q2. Если K=Ki, то перейти на Q4.

Q3. Увеличить i на 1 и вернутся к шагу Q2.

Q4. Если i<=N, алгоритм оканчивается удачно; в противном случае - неудачно(i=N+1).

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

Имеется таблица записей R1,R2,...,Rn, причём ключи удовлетворяют неравенствам K1<K2<...<Kn. Алгоритм предназначен для поиска записи с данным ключом K. В целях удобства и увеличения скорости работы предполагается, что в конце таблицы расположена фиктивная запись Rn+1, ключ которой Kn+1= >K.

T1. Установить i <=1.

T2. Если K<=Ki, то перейти на T4.

T3. Увеличить i на 1 и вернутся к шагу T2.

T4. Если K=Ki, то алгоритм оканчивается удачно, в противном случае - неудачно, нужной записи в таблице нет.