Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 основи програмування книга.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

7.6. Пошук елемента в масиві

Задача пошуку елемента в послідовності – одна з важливих задач програмування як з теоретичної, так і практичної точок зору. Ось її формулювання:

Нехай A = {a1, a2, ...} – послідовність однотипних елементів і b – деякий елемент, який має властивість P. Знайти місце елемента b в послідовності А. Оскільки представлення послідовності в пам’яті може бути здійснено в виді масиву, задачі можуть бути уточнені як задачі пошуку елемента в масиві A:

  • Знайти максимальний елемент масиву;

  • Знайти даний елемент масиву;

  • Знайти k-тий за величиною елемент масиву;

Найбільш прості і часто оптимальні алгоритми основані на послідовному перегляді масиву A з перевіркою властивості P на кожному елементі.

Приклад 7.7. Пошук мінімального елемента в масиві.

Const

n = 10;

Type

Vector = array[1..n] of Real;

Рrocedure MinItem (Var A: Vector; Var Min: Real);

Var

i : Integer;

Begin

Min := A[1];

For i := 1 to n do begin

If Min > A[i]

then Min := A[i]

end;

End;

Begin

{Блок введення масиву}

MinItem (A, Min);

{Виведення значення Min}

End.

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

7.7. Ефективність алгоритму за часом

Раніш, ніж розглянути задачу пошуку даного елемента, відзначимо важливу відмінну особливість алгоритмів обробки масивів: їх складність визначається характерними параметрами – розмірами вхідних масивів. У розглянутих вище прикладах розмір входу – константа n.

Програма Складність Оцінка складності

ScalarMult T(n) = Tb*n T(n) = O(n)

ScalarMult1 T(n) = Tb*n/2 T(n) = O(n)

MinElement T(n) = Tb*n T(n) = O(n)

Тут T (b) - складність тіла (внутрішнього) циклу. В реальних програмах величина Tb залежить від багатьох факторів, зв’язаних з апаратурою, операційною системою і системою програмування. Тому якість алгоритму, реалізованого у виді програми і не залежного від зовнішніх обставин можна оцінити функцією параметра задачі. При цьому основна властивість функції оцінки складності – швидкість її росту. Для алгоритму ScalarMult ця функція зростає лінійно. Цей факт відображений формулою T(n) = O(n).

Абстрагування від деталей реалізації програми дає можливість оцінювати алгоритми розв’язування задач і їх реалізацію у виді програми. Мірою ефективності алгоритму є оцінка його складності.

Розглянемо задачу пошуку даного елемента в масиві. Очевидний алгоритм її розв’язання, як і в попередній задачі – послідовний перегляд масиву і порівняння кожного елемента масиву з даним. Відміна полягає в тому, що коли елемент знайдений, перегляд можна припинити. Це означає, що виконання циклу переривається. У мові є засіб переривання – оператор переходу.

7.8. Мітки. Оператор переходу. Застосування оператора переходу для дострокового виходу з циклу

Оператор переходу вказує, що подальша робота (виконання програми) повинна продовжуватись з іншої точки програми, а саме, з оператора, відміченого міткою.

Оператор має вид:

Goto < мітка >

Мітка представляє собою ціле число без знака, що складається не більш ніж з 4 цифр. У розділі операторів кожна мітка може зустрічатися тільки перед одним оператором. Кожна мітка, що зустрічається в розділі операторів, повинна бути описана в розділі міток.

Розділ міток визначений наступною діаграмою:

Розділ міток

Після мітки, що відмічає оператор, треба ставити двокрапку. Наприклад:

1995 : х := х +I; 1 : read(Y);

Увага! Дія оператора переходу усередину складеного оператора ззовні не визначена.

Оператор переходу слід використати у незвичайних, виняткових ситуаціях, коли доводиться порушувати природну структуру алгоритму. Треба пам’ятати, що будь-який алгоритм може бути реалізований без застосування Goto без втрати ефективності. Цей факт має принциповий характер. Саме тому структурний стиль програмування іноді називають “Програмування без Goto”.

У якості єдиного приклада програми з Goto розглянемо задачу пошуку елемента в одномірному масиві.

Приклад 7.8.

Program Search_in_Array;

Label 1;

Const

n = 100;

Type

Vector = array[1..n] of Real;

Var

A : Vector;

b : Real;

Flag : Boolean;

Procedure InpMas(Var V : Vector);

Var i : Integer;

Begin

For i := 1 to n do begin

Write(‘Введіть елемент масива : ‘);

Readln(V[i]);

end;

End;

Procedure InpData(Var b:Real);

Begin

Write(‘Введіть шукане значення : ‘);

Readln(b)

End;

Procedure Found (Var A : Vector; b : Real);

Var i : Integer;

Flag : Boolean;

Begin

Flag := true;

For i := 1 to n do

If A[i] = b then begin

Flag := false;

goto1

end; { переривання циклу }

1:If Flag

then Writeln(‘ Елемент ‘,b,’ у масиві відсутній ’)

else Writeln(‘ елемент ‘,b,’ стоїть на ’,i,’-тому місці ’);

End;

Begin

{Блок читання масиву A і елемента b}

InpMas(A);

InpData(b);

Found (A, b);

End.

Цікавий розв’язок цієї задачі без застосування Goto буде розглянуто нижче.