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

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

Задача поиска. Пусть заданы линейные списки: список элементов В=<К1,К2,К3,...,Кn> и список ключей V= (в простейшем случае это целые числа). Требуется для каждого значения Vi из V найти множество всех совпадающих с ним элементов из В. Чаще всего встречается ситуация когда V содержит один элемент, а в В имеется не более одного такого элемента.

Эффективность некоторого алгоритма поиска А оценивается максимальным Max{А} и средним Avg{А} количествами сравнений, необходимых для нахождения элемента V в В. Если Pi - относительная частота использования элемента Кi в В, а Si - количество сравнений,необходимое для его поиска, то

n

Max{А} = max{ Si, i=1,n } ; Avg{А} = Pi Si .

i=1

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

Очевидно, что Max последовательного поиска равен N. Если частота использования каждого элемента списка одинакова, т.е. P=1/N, то Avg последовательного поиска равно N/2. При различной частоте использования элементов Avg можно улучшить, если поместить часто встречаемые элементы в начало списка.

Пусть во входном потоке задано 100 целых чисел К1,К2,... К100 и ключ V. Составим программу для последовательного хранения элементов Кi и поиска среди них элемента, равного V, причем такого элемента может и не быть в списке. Без использования стоппера программа может быть реализована следующим образом:

/* последовательный поиск без стоппера */

#include

main()

{

int k[100],v,i;

for (i=0;i<100;i++)

scanf("%d",&k[i]);

scanf("%d",&v);

i=0;

while(k[i]!=v && i<100) i++;

if (k[i]==v) printf("%d %d",v,i);

else printf("%d не найден",v);

}

21.Сортировка данных в линейном списке. Назначение и варианты реализации. Упорядочивание списка. Вставление элемента в середину списка.

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

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

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

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

Графически это можно представить так:

Операторы, выполняющие данную задачу будут следующими:

New(x); x^.Data := Digit; px^.Next := x; x^.Next := dx;

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

Procedure InsInto(Digit : integer; Var Head : Ukazatel ); Var   dx, px, x : Ukazatel ; Begin   New(x);   x^.Data := Digit;   x^.Next := Nil;   if Head = Nil     then {Если список пуст, то вставляем первый элемент}       Head := x     else     {Если список не пуст, то просматриваем его до тех пор, пока не отыщется подходящее место для x^ или не закончится список}       Begin         dx := Head;         px := Head;         while (px<>Nil) and (px^.Data<=Digit) do           Begin             dx := px;             px :=px^.Next;           End;         if px=Nil           then {Пройден весь список}             dx^.Next := x {Элемент добавляется в конец списка}           else {Пройден не весь список}             Begin               x^.Next := px;                 if px=Head                   then                     Head := x {Вставляем в начало списка}                   else                     dx^.Next := x; {Вставляем внутрь списка}             End;       End; End;