Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lectures-pas.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
676.86 Кб
Скачать

18 Задача поиска: алгоритмы и программы

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

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

18.1 Линейный поиск

Линейный поиск заключается в последовательном сравнении элементов упорядоченного массива Х с искомым значением isk. Поиск в этом случае заканчивается в двух случаях:

  1. Очередной элемент массива Х равен искомому значению isk, в этом случае элемент найден.

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

Схема алгоритма линейного поиска

нет да

нет

да

В худшем случае для поиска заданного элемента алгоритмом линейного поиска приходится проводить n сравнений, т.е. временная сложность алгоритма  n.

Текст программы линейного поиска

Uses crt;

Var

X:array[1..10000] of integer;

i, n, isk:integer;

Begin

write(' Введите число элементов в массиве - n ');

readln(n);

write(' Введите элементы массива Х ');

for i:=1 to n do read(X[i]); writeln;

write(' Введите искомое число'); readln(isk);

for i:=1 to n do

if X[i]=isk then

begin

writeln(' Элемент найден по адресу i = ' ,i );

readln; exit

end

else if X[i]>isk then break;

writeln(' Заданного элемента нет');

readln;

End.

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

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

Временная сложность алгоритма двоичного поиска  log2n.

Схема алгоритма двоичного поиска

First - адрес начала просматриваемой части.

Last - адрес конца просматриваемой части

< =

>

Текст программы

Uses crt;

Var X:array[1..10000] of integer;

isk,i,n,adr,First,Last:integer;

Begin

write(' Введите число элементов в массиве - n ');

readln(n);

write(' Введите элементы массива Х ');

for i:=1 to n do read(X[i]);

writeln;

write(' Введите искомое число');

readln(isk);

First:=1; Last:=n;

while First <= Last do begin

adr:=(First+Last) div 2;

if isk=X[adr] then

begin writeln('Yes! isk = ',isk,' adr = ',adr);

exit

end

else if isk<X[adr] then Last:=adr-1

else First:=adr+1;

end;

writeln(' Not found');

end.

Лабораторная работа №11

Цель работы:

  1. Изучить алгоритмы поиска.

  2. Приобрести навыки программирования задач поиска данных различных типов.

Типовое задание

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

Варианты самостоятельных заданий

В а р и а н т 1

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Шифр книги Ф.И.О. авторов Название Год

тип строка тип строка тип строка издания

5 символов 20 символов 15 символов целое

Список упорядочен по возрастанию года издания.

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

В а р и а н т 2

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Шифр товара Наименование Цена (в руб.) Количество

тип строка тип строка вещественное экземпляров

5 символов 20 символов число целое число

Список упорядочен по убыванию цены товара.

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

В а р и а н т 3

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Номер рейса Пункт отправления Пункт назначения Дни

тип строка тип строка тип строка полетов

5 символов 10 символов 10 символов от 1 до 7

Список упорядочен по наименованию пунктов отправления (по алфавиту).

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

В а р и а н т 4

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. Домашний адрес Номер участка Год

тип строка тип строка тип рождения

15 символов 20 символов integer 1900..2000

Список упорядочен по возрастанию года рождения.

Разработать алгоритмы и программы линейного и двоичного поиска всех граждан из списка, родившихся до 1950 года с выводом найденных записей на экран.

В а р и а н т 5

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Шифр товара Наименование товара Цена (руб.) Признак

тип строка тип строка число типа наличия или

5 символов 20 символов real отсутствия

Список упорядочен по убыванию цены товара.

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

В а р и а н т 6

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. Факультет Группа Год рождения

20 символов 5 символов 6 символов целое число

Список упорядочен по убыванию года рождения.

Разработать алгоритмы и программы линейного и двоичного поиска всех студентов, родившихся до 1979 года с выводом найденных записей на экран.

В а р и а н т 7

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. авторов Название Год Шифр

тип строка тип строка издания строка

20 символов 20 символов целое 8 символов

Список упорядочен по убыванию года рождения.

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

В а р и а н т 8

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. авторов Название Год Шифр

тип строка тип строка издания строка

20 символов 20 символов целое 8 символов

Список упорядочен по возрастанию года издания.

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

В а р и а н т 9

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Номер рейса Пункт отправления Пункт назначения Дни

тип тип строка тип строка полетов

integer 20 символов 10 символов от 1 до 7

Список упорядочен по возрастанию номеров рейсов.

Разработать алгоритмы и программы линейного и двоичного поиска всех рейсов с номерами большими, чем 50 с выводом найденных записей на экран.

В а р и а н т 10

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. Домашний адрес Номер участка Год

тип строка тип строка тип рождения

15 символов 30 символов integer 1900..2000

Список упорядочен оп убыванию года рождения.

Разработать алгоритмы и программы линейного и двоичного поиск всех граждан, родившихся до 1970 года с выводом найденных записей на экран.

В а р и а н т 11

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Шифр книги Ф.И.О. авторов Название Год

тип строка тип строка тип строка издания

5 символов 20 символов 15 символов целое

Список упорядочен по убыванию года издания.

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

В а р и а н т 12

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Шифр товара Наименование Цена(в руб.) Количество

тип строка тип строка вещественное экземпляров

5 символов 20 символов число целое число

список упорядочен по возрастанию цены.

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

В а р и а н т 13

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Номер рейса Пункт отправления Пункт назначения Дни

тип строка тип строка тип строка полетов

5 символов 12 символов 10 символов от 1 до 7

Список упорядочен по полю "Пункт назначения" (по алфавиту).

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

В а р и а н т 14

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. Домашний адрес Номер участка Год

тип строка тип строка тип рождения

15 символов 20 символов integer 1900..2000

Список упорядочен по убыванию года рождения.

Разработать алгоритмы и программы линейного и двоичного поиска всех граждан из списка, родившихся до 1980 года с выводом найденных записей на экран.

В а р и а н т 15

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Шифр товара Наименование товара Цена(руб.) Признак

тип строка тип строка число типа наличия или

5 символов 20 символов real отсутствия

Список упорядочен по возрастанию цены.

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

В а р и а н т 16

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. Факультет Группа Год рождения

20 символов 5 символов 6 символов целое число

Список упорядочен по убыванию года рождения.

Разработать алгоритмы и программылинейного и двоичного поиска всех студентов, родившихся до 1980 года с выводом найденных записей на экран.

В а р и а н т 17

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. авторов Название Год Шифр

тип строка тип строка издания строка

20 символов 20 символов целое 8 символов

Список упорядочен по возрастанию года издания.

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

В а р и а н т 18

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. авторов Название Год Шифр

тип строка тип строка издания строка

20 символов 20 символов целое 8 символов

Список упорядочен по полю "Шифр" (по алфавиту).

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

В а р и а н т 19

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Номер рейса Пункт отправления Пункт назначения Дни

тип тип строка тип строка полетов

integer 20 символов 15 символов от 1 до 7

Список упорядочен по убыванию номеров рейсов.

Разработать алгоритмы и программы линейного и двоичного поиска всех рейсов с номерами меньшими, чем 100 с выводом найденных записей на экран.

В а р и а н т 20

Дан список, содержащий 10 записей, каждая из которых имеет структуру:

Ф.И.О. Домашний адрес Номер участка Год

тип строка тип строка тип рождения

15 символов 30 символов integer 1900..2000

Список упорядочен по возрастанию года рождения.

Разработать алгоритмы и программы линейного и двоичного поиска всех граждан, родившихся после 1970 г. с выводом найденных записей на экран.

Литература

  1. В.В. Фаронов ТурбоПаскаль 7.0. Начальный курс. Учебное пособие. - М.: «Нолидж», 1997

  2. Вирт Н. Алгоритмы + структуры данных = программы.- М.: Мир, 1985

  3. Кнут Д. Искусство программирования для ЭВМ. Т. 3. Сортировка и

поиск.- М.:Мир, 1978.

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