русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Бинарный поиск в упорядоченных массивах


Дата добавления: 2014-11-27; просмотров: 2582; Нарушение авторских прав


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

Одним из эффективных методов поиска в больших отсортированных масси­вах является бинарный поиск, или поиск методом деления пополам. В основе этого метода лежит идея целенаправленных последовательных догадок о пред­полагаемом местоположении искомого элемента. Такой метод можно проил­люстрировать на примере шуточного совета, как поймать в Африке льва: «Для начала разделим Африку пополам. Ясно, что лев находится только в од­ной половине. Та половина, в которой находится лев, снова делится пополам, и т. д. Площадь Африки приблизительно 30 млн км2. Следовательно, после примерно 45 делений;мы получим площадку, не превышающую 1 м2. Теперь на такой площадке льва поймать нетрудно».

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



Упражнение 2.Создадим программу, выполняющую бинарный поиск задан­ного элемента в отсортированном массиве целых чисел, элементы которого имеют значения: 20, 20, 19, 19, 19, 18, 17, 17, 12, 12, 11, 10, 9, 9, 5, 5, 3, 3, 2, 1.

Введем в разделе описания констант размер массива Count = 20 и опишем массив целых чисел:

М : array[l ..Count] оf byte (20, 20, 19, 19, 19, 18, 17, 17, 12, 12, 11, 10, 9, 9, 5, 5, 3, 3, 2, 1).

В разделе описания переменных опишем следующие переменные:

N — для хранения значения искомого элемента;

I — для указания очередного элемента массива;

First — указание индекса элемента, являющегося левой границей рассматри­ваемой части массива;

Last — указание индекса элемента, являющегося правой границей рассматри­ваемой части массива;

Found — логическая переменная, в которую будет записываться результат по­иска;

А — переменная, значение которой будет равно числу перестановок элементов,

В начале программы реализуем вывод исходного массива на экран, затем вы­вод запроса искомого элемента, после чего считывание его значения в пере­менную N.

Перед началом поиска обнулим счетчик повторений А, установим левую и правую границы рассматриваемой части массива, а переменной Found при­своим значение False — элемент пока не найден.

Текст программы будет выглядеть следующим образом:
program Find_Bin;

const

Count=20;

М : array[l ..Count] оf byte (20, 20, 19, 19, 19, 18, 17, 17, 12, 12, 11, 10, 9, 9, 5, 5, 3, 3, 2, 1);

var

N, I, First, Last : Byte;

A : integer;

Found : boolean;

begin

Writeln (‘Исходный массив: '); :

for I:=I to Count do

Write (M[I]:3,' ');

Writeln;

Writeln;

Write ('Введите значение элемента массива для поиска >');

Readln(N);

А:=0;

First := 1;

Last := Count;

Found:=False; {Элемент, не найден}
repeat {Повторять поиск}

I := (First + Last) div 2; {Разделить на две части}

if M[I] = N then Found:=True

else

begin

if M[I] > N then first := I+1 {Искать элемент в правой части}
else Last := I-1; {Искать злемект в левой части}
end;

А:=А+1; {Увеличить счетчик числа итераций}

until (Found) or (First>Last); {Завершить, если найдется искомый элемент или будет просмотрен весь массив}

if Found then Writeln('Искомый элемент ' ,N, ‘ в массиве занимает’ ,I, ' - ю позицию)

else

Writeln (‘B массиве нет искомого элемента ', N);

Writeln (‘Поиск выполнен за ' ,А, ' итераций ');

end.

Обратите внимание на то, что бинарный по­иск в сортированных массивах выполняется за небольшое число итераций!

Упражнение 3.Создадим программу, формирующую двумерный массив слу­чайных чисел и вычисляющую значение среднего арифметического его эле­ментов, больших, чем 20. Решение задачи сводится к последовательному перебору всех элемёнтов-массива с вычислением суммы тех элементов, зна­чение которых больше 20, а по окончании их суммирования производится вычисление частного полученной суммы и количества элементов массива, удовлетворяющих условию суммирования.

В разделе описания программы опишем квадратный двумерный массив, ука­зав в разделе описания констант количество строк Strok =15 и количество столбцов Stolb =15, а в разделе описания переменных — массив целых чисел:

D : array (L ..Strok, J..Stolb] of integer;

Для указания положения элемента в массиве введем переменные:

I — номер строки, в которой расположен элемент;

J—номер столбца, в котором расположен элемент.

Для подсчета количества элементов массива, больших 20, введем целую пе­ременную К, а для подсчета их суммы, а затем и значения среднего арифме­тического введем вещественную переменную S. Для заполнения массива
случайными целыми числами применим функцию Random и поэтому в нача­ле описания поместим подключение стандартного модуля Crt, в котором она
содержится.

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

program Sum_Mas_2;

uses Crt;

const

Strok=15; '

Stolb=15;

var

D: array[I..Strok, J..Stolb] of Integer;

I, J, К : integer;

S : real;

begin

Randomize; {Генерация массива случайных чисел}
for I:= 1 to Strok do

for J:= 1 to Stolb do

D[I, J]:=Random(99);

S:= 0;

K:= 0;

for I:= 1 to Strok do {Вычисление сунмы элементов массива>20}
begin

for J:= 1 to Stolb do {Просмотр всех элементов в 1-й строке}
begin

Write (D[I, J]:2, ' '):

if D[I, J] >20 then {Если найден элемент D[I.J]>20}
begin

S:=S+D[I, J]; {Суммирование подходящих элементов}

К: = К+1; {Увеличение счетчика подходящих элементов}

end;

end;

Writeln; {Переход к печати массива в следующей строке экрана}

end;

S:=S/K: {Расчет среднего арифметического}

Write1n ( ' Среднее арифметическое элементов массива, больших 20 = ', 5: 5: 3); Readln;

end.



<== предыдущая лекция | следующая лекция ==>
Практическая работа №12. | Практическая работа № 13.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.