Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички.C++ / Конспект Лекций - Части 1,2.pdf
Скачиваний:
275
Добавлен:
24.02.2016
Размер:
1.97 Mб
Скачать

Возьмем начальное приближение x(0) = (0; 0; 0)Т. Тогда для k=1 очевидно, что значение x (1) = (0,5; 0,8; 1,5)Т. Подставим эти значения в (31), т.е. при k=2, по-

лучим x(2) = (1,075; 1,3; 1,175)Т.

Ошибка ε2

= max

x(2)

x(1)

= max(0,575; 0,5; 0,325) = 0,575.

 

1i2

i

i

 

 

 

 

 

Блок-схема алгоритма нахождения решения СЛАУ по методу простых итераций согласно рабочим формулам (13.29) представлена на рис. 2.5 [4].

14.Поиск и сортировка

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

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

Типичными примерами может служить работа с тем или иным справочником, телефонной книгой, картотекой в библиотеке и т.д.

Пусть множество из n элементов задано в виде массива a[n].

К наиболее простым задачам поиска можно отнести следующие операции.

1.Найти хотя бы один элемент, равный заданному значению Х. В результате необходимо получить i – индекс (порядковый номер) элемента массива, для которого выполняется равенство a[i]=X.

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

Иногда поиск организуется не по совпадению со значением элемента X, а по выполнению некоторых заданных условий. Например, организуется поиск для интервала значений, т.е. когда отыскиваются элементы, удовлетворяющие неравенствам X1≤a[i]≤X2, где значения для Х1 и Х2 заданы.

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

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

Таким образом, если какая либо дополнительная информация о разыскиваемых данных не задана, то очевиден следующий подход – простой последовательный просмотр массива данных. Такой метод называют линейный (последовательный) поиск.

Рассмотрим реализацию алгоритма последовательного поиска для первой задачи.

Условием окончания поиска является одна из следующих двух ситуаций:

1.Требуемый элемент найден, т. е.условие a[i] = Х выполняется.

191

2. Весь массив просмотрен, но совпадения обнаружено не было, т.е. требуемый элемент отсутствует.

Одним из возможных алгоритмов решения данной задачи может быть: 1.Вводим переменную flag логического типа, которая иметь значение «ис-

тина» (1), если требуемый элемент в массиве найден и «ложь» (0)в противном случае.

2. ix – переменная для номера искомого элемента.

flag = «ложь» ; ix=0;

Начало цикла (выполнять для i от 1 до N)

если a[i] == X

тогда

flag = «истина»;

ix=i;

все

конец цикла

если flag==1 тогда:

вывод: «элемент найден, его номер=ix»; иначе: вывод: «элемент не найден».

т.е если после выполнения алгоритма flag=«истина», то элемент нашли, и если в массиве несколько таких элементов, то в переменной ix будет храниться

Если же переменная flag не изменила своего значения, значит элемента нет, и переменная осталась в нуле.

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

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

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

И в этом случае получив следующий алгоритм:

flag = «ложь» ; ix=0; i=1;

Начало цикла: выполнять пока (i≤N и a[i]!=X)

если a[i] == X

тогда

flag = «истина»;

ix=i;

все

i++;

конец цикла

192

если flag==1 тогда:

вывод: «элемент найден, его номер=ix»; иначе: вывод: «элемент не найден».

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

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

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

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

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

Для этого достаточно в конец массива поместить дополнительный элемент со значением X. Этот вспомогательный элемент называют «барьером», или «часовым» так как он препятствует выходу за пределы массива. Размер исходного массива теперь N+1 элемент.

Алгоритм линейного поиска с «барьером» выглядит следующим образом:

A[N+1]=X; ix=0; i=1;

Начало цикла: выполнять пока (a[i]!=X)

если a[i] == X

тогда

ix=i;

все

i++;

конец цикла

если i!=N+1 тогда:

вывод: «элемент найден, его номер=ix»; иначе: вывод: «элемент не найден».

Равенство i=N+1 свидетельствует о том, что совпадения не произошло (если считать совпадение с «барьером» контрольной точкой для завершения полного цикла).

Для реализации алгоритмов поиска в задачах типа 2 (напомним: нахождение количества элементов, равных значению X). Здесь в любом случае нужно просмотреть весь массив.

193

Вводим переменную, значение которой будет увеличиваться каждый раз на 1, когда будет найден нужный элемент. Такую переменную называют «счетчиком».

А, для получения индексов искомых элементов, введем массив b[N]. Как только будет найден необходимый элемент, его индекс будет заноситься в массив b. В переменной k будет храниться индекс первого свободного места в массиве b.

Изначально k=1. ix=0;

Начало цикла (выполнять для i от 1 до N)

если a[i] == X

тогда

b[k]=i

k++;

все Конец цикла

если k!=1 тогда:

вывод: «элементы найдены, их номера=» Начало цикла (выполнять для i от 1 до k-1)

Вывод b[i]; Конец цикла.

иначе: вывод: «элементы не найдены»;

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

Итак, для хранения текущего максимума введем переменную max а для его индекса переменную k. Алгоритм поиска будет таким.

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

max=a[1];

k=1;

Начало цикла (выполнять для i от 2 до N) Если

Тогда

max=a[i];

k=I;

все Конец цикла.

194

Соседние файлы в папке методички.C++