Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комплект Информатика / Курс лекций.doc
Скачиваний:
126
Добавлен:
22.05.2015
Размер:
4.8 Mб
Скачать

Контрольные вопросы

1. Какие этапы включает в себя разработка программы? Всегда ли эти этапы являются обязательными?

2. Охарактеризуйте фазы решения задач, предложенные математиком Дж. Полиа. Приведите примеры из жизни.

3. Назовите общие методы решения задач и дайте их характеристику.

4. Почему создание алгоритма является искусством, хотя теория алгоритмов является наукой?

5. Создайте алгоритм решения следующей задачи. Имеются кувшины емкостью 3 и 7 литров. Как получить 5 литров воды?

Лекция № 16 Итерационные структуры в алгоритмах

Цель лекции

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

План лекции

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

2. Управление циклами.

3. Алгоритм сортировки методом вставки.

В ходе этой лекции мы обсудим итерационные структуры, в которых выполнение набора инструкций повторяется в циклическом режиме. Мы также познакомимся с некоторыми популярными алгоритмами — последовательного и двоичного поиска, а также с алгоритмом сортировки методом вставки. Начнем с рассмотрения алгоритма последовательного поиска.

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

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

Давайте попробуем представить, как бы мы действовали при поиске определенного имени в списке гостей, содержащем около 20 фамилий. В данном случае можно было бы просмотреть весь список от начала и до конца, сравнивая каждый его элемент с искомым именем. Если требуемое имя будет найдено, поиск завершится успешно. Однако, если будет достигнут конец списка или обнаружено имя, расположенное по алфавиту после искомого, поиск завершится неудачей. (Не забывайте, что список упорядочен в алфавитном порядке, поэтому если будет найдено имя, расположенное по алфавиту после требуемого, то это означает, что нужного нам имени в списке нет.) Таким образом, наша задача — выполнять последовательный просмотр элементов списка в направлении сверху вниз до тех пор, пока не будут проверены все имена или нужное нам имя не будет найдено.

С помощью нашего псевдокода этот процесс можно представить следующим образом:

Выбрать в качестве ПроверяемоеЗначение первый элемент Списка;

while (ИскомоеЗначение > ПроверяемоеЗначениеи и есть непроверенные элементы Списка)

do (выбрать в качестве ПроверяемоеЗначение следующий элемент Списка)

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

if (ИскомоеЗначение = ПроверяемоеЗначение)

then {сообщить об успехе}

else {сообщить о неудаче}

Наконец, в нашей программе предполагается, что первая инструкция, где в качестве проверяемого значения явно указан первый элемент списка, содержит, как минимум, один элемент. Конечно же, это условие могло бы выполняться всегда, однако для полной уверенности в правильности программы следует поместить составленную выше программу в предложение else следующей инструкции if:

if (Список пуст)

then (сообщить о неудаче)

else (...)

В результате получается процедура, текст которой приведен на рис. 1:

Рисунок 1 - Алгоритм последовательного поиска, записанный с помощью псевдокода

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

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

Эта инструкция позволяет установить, является ли Даррел Бейкер пассажиром некоторого рейса. Вот еще один пример:

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

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

Итак, можно сказать, что представленный на рис. 1 алгоритм последовательно рассматривает все элементы списка. По этой причине данный алгоритм называется алгоритмом последовательного поиска (sequential search). В силу своей простоты он часто применяется к коротким спискам либо когда это необходимо по каким-то иным соображениям. Однако в случае длинных списков этот метод оказывается менее эффективным, чем другие (в чем мы скоро убедимся).