русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

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


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Типові алгоритми пошуку максимуму й мінімуму


Дата додавання: 2014-11-28; переглядів: 1032.


У цій главі ми вивчимо найпростіші статистичні алгоритми, головний з яких – визначення максимального й мінімального значення на безлічі даних.

Розглянемо алгоритм у загальному виді:

  1. описати для кожного максимуму й мінімуму по одній змінної того ж типу, що аналізовані дані;
  2. до циклу максимуму привласнюється або свідомо мале для аналізованих даних значення, або перший елемент даних; мінімуму привласнюється або свідомо велике для аналізованих даних значення, або перший елемент даних;
  3. у тілі циклу кожний підходящий для пошуку елемент даних t обробляється операторами виду:
    if t>max then max:=t; - для максимуму;
    if t<min then min:=t; - для мінімуму,
    де max і min – змінні для максимуму й мінімуму відповідно.

Крок 2 цього алгоритму вимагає коментарів, які ми зробимо на прикладі пошуку максимуму. Очевидно, що сам алгоритм нескладний – кожний елемент даних t послідовно рівняється з коміркою пам'яті max і, якщо виявлене значення t, більше поточного значення max, воно заноситься в max оператором max:=t;. Як ми пам'ятаємо, після опису на кроці 1 змінної max, її значення ще не визначене, і може виявитися кожним – звідки випливає необхідність завдання початкового значення. Представимо, що після вибору початкового значення max, рівного нулю, при аналізі зустрілися тільки негативні значення елементів t. У цьому випадку умова t>max не виконається жодного разу й відповіддю буде max, рівне нулю, що неправильно! Вибір свідомо малого початкового значення max (наприклад, значення -1E30, тобто -1030, чи навряд зустрінеться в будь-яких реальних даних) гарантує, що умова t>max виконається хоча б раз і максимум буде знайдений. Альтернативний спосіб – привласнити max значення окремо обчисленого першого елемента послідовності даних. У цьому випадку відповідь або вже знайдений, якщо перший елемент і є максимальний, або буде знайдений у циклі.

Аналогічні міркування допомагають зрозуміти, чому мінімуму слід привласнювати в якості початкового значення свідомо велике число.

Перейдемо до прикладів.

Пр. Для функції y(x)=sin2(x), знайти мінімальне серед позитивних і максимальне значення.

Позначивши шукані значення min і max відповідно, складемо наступну програму:

var x,y,max,min:real;

begin

x:=-pi/3;

max:=-2;

min:=2; {ці початкові значення - свідомо мале й велике для синуса}

while x<=pi/3+1e-6 do begin

y:=sqr(sin(x));

if y>0 then {шукаємо min тільки серед позитивних!}

if y<min then min:=y;

if y>max then max:=y;

x:=x+pi/24;

end;

writeln ('Мінімум =',min:8:2);

writeln ('Максимум=',max:8:2);

reset (input); readln;

end.

 

У наступному прикладі додатково збережемо значення аргументів функції, для яких знайдені мінімум і максимум.

Пр. Послідовність T(k) задана співвідношеннями T(k)=max(sin k, cos k), k=1,2,…,31. Знайти номери максимального й мінімального елементів послідовності.

Пошук номерів не позбавить нас від необхідності пошуку значень. Тому, крім змінних min і max, нам знадобляться дві Цілочисельні змінні для зберігання номерів мінімального й максимального значень, позначимо їх kmin і kmax відповідно. Звернете також увагу, що на кожному кроці циклу додатково буде потрібно знаходити максимальне зі значень sin(k) і cos(k), для занесення його в t.

var t,max,min:real;

k,kmin,kmax:integer;

begin

min:=1e30; {не визначаючи свідомо великого й малого для цих даних значень,}

max:=-1e30;{задаємо "надійні" значення, близькі до плюс і мінус нескінченності}

for k:=1 to 31 do begin

if sin(k)>cos(k) then t:=sin(k)

else t:=cos(k);

if t<min then begin

{ за умовою потрібні 2 оператора - збереження нового хв. значення}

{і збереження номера елемента, звідси операторные дужки!}

min:=t; kmin:=k;

end;

if t>max then begin

max:=t; kmax:=k;

end;

end;

writeln ('Номер хв. елемента =',kmin);

writeln ('Номер макс. елемента=',kmax);

reset (input); readln;

end.

 


<== попередня лекція | наступна лекція ==>
Алгоритми нагромадження суми й добутку | Одномірні масиви. Опис, уведення, вивід і обробка масивів на Паскалі


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн