Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2222222222222.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
521.07 Кб
Скачать
  1. Алгоритми пошуку елемента в масиві.

Одна із найбільш часто використовуваних операцій в програмуванні - пошук. Під пошуком розуміється послідовність дій, необхідних для визначення позиції входження елемента із певним значенням в деякій сукупності даних. Припускається, що група даних, в якій необхідно відшукати заданий ключ, є фіксована, а всі елементи певним чином впорядковані. Не обмежуючи загальності вважатимемо, що множина N елементів деякого абстрактного типу basetype задана у вигляді масиву

a : array [1..N] of basetype.

лінійний пошук елемента в масиві

Якщо не має ніякої додаткової інформації про відшукувані дані, то очевидним підхідом є простий послідовний перегляд масиву із збільшенням кроку за кроком тієї його частини, де потрібного елемента не знайдено. Такий метод називається лінійним пошуком. Умовою припинення пошуку буде одна із наступних :

1) шуканий елемент знайдений в деякій позиції i, тобто a[i]=x ;

2) весь масив переглянутий і шуканий елемент відсутній.

Таким чином, алгоритм лінійного пошуку можна записати у вигляді послідовності команд:

i:=1; while (i<=N) and (a[i]<>x) do i:=i+1;

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

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

a : array [1..N+1] of basetype.

Алгоритм в цьому випадку матиме вигляд :

i:=1; a[N+1]:=x; while a[i]<>x do i:=i+1;

В обох випадках алгоритму істинність умови i=N+1 свідчить про відсутність шуканого елемента в масиві.

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

Спочатку оцінимо кількість порівняння ключів. Зрозуміло, що для обох алгоритмів вона буде однаковою. В найкращому випадку, коли потрібний елемент знаходиться на першому місці, виконається лише одна операція. В найгіршому випадку, коли шуканого елемента не має, виконається N операцій. Середня ж кількість порівнянь - N/2.

Якщо враховувати і порівняння індексів для встановлення кінця масиву, то початковий варіант алгоритму потребуватиме додатково ще такуж саму кількість.

Пошук діленням пополам (бінарний пошук)

Очевидно, що ніякого іншого способу підвищення ефективності пошуку в масиві

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

Розглядуваний алгоритм базується на таких принципах: 1) вибирається довільно деякий елемент наприклад m ; 2) проводиться порівняння m з аргументом пошуку; 3) якщо значення співпадають, то пошук припиняється, якщо m<x, то відкидаються розглядувані всі елементи масиву до m включно, якщо m>x, то відкидаються розгляду всі елементи масиву після m включно.

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

Розглядуваний алгоритм базується на таких принципах: 1) вибирається довільно деякий елемент, наприклад a[m]; 2) проводиться порівняння a[m] з аргументом пошуку x; 3) якщо значення співпадають, то пошук припиняється, якщо a m<x, то відкидаються з розгляду всі елементи масиву до a[m] включно, якщо a m>x, то відкидаються з розгляду всі елементи масиву після a[m] включно.

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

Введемо наступні позначення: L, R - індексні змінні, що відмічають відповідно лівий і правий кінці частини масиву, де ще можна знайти потрібний елемент. Алгоритм такого пошуку можна записати у вигляді послідовності команд :

L:=1; R:=N; f:=true; while (L<=R) and f do begin m:=k; {k - довільне значення між L і R} if a[m]=x then f:=false else if a[m]<x then L:=m+1 else R:=m-1 end;

Очевидно, що вибір m може бути довільним. Однак найкраще - відкидати на кожному кроці, незалежно від результату порівняння, якомога більше елементів. Оптимальним є вибір серединного елемента в розглядуваній частині, оскільки завжди рівноімовірно відкидатиметься половина масиву. В результаті максимальна кількість порівнянь округлює число log(N) до найближчого цілого. Це значно краще від лінійного пошуку (середня кількість порівнянь - N/2).

Ефективність алгоритму можна дещо покращити. Перевірку на рівність із шуканим ключем можна виконувати в другу чергу, оскільки вона зустрічається лише один раз і приводить до припинення пошуку. Крім того ймовірність точного попадання в потрібне значення є меншою ніж попадання в більше або менше значення. Тому варто поміняти місцями заголовки умовних операторів :

if a[m]<x then L:=m+1 else if a[m]>x then R:=m-1 else f:=false;

Однак, можна ще покращити ефективність, якщо спростити умову припинення алгоритму. Для цього необхідно відмовитися від бажання припинення пошуку при фіксації співпадання. Тоді пошук продовжуватиметься доти, доки досліджувана частина масиву не стягнеться до одного елемента, який і буде шуканим :

L:=1; R:=N; while L<R do begin m:=(L+R) div 2; if a[m]<x then L:=m+1 else R:=m end;

Умова припинення циклу L>=R досягається. Адже для цілочисельного серединного значення m справедлива нерівність L<=m<R, якщо попередньо виконувалася умова L<R. Отже, або L збільшується при присвоєнні йому значення m+1, або R зменшується при присвоєнні йому значення m. Таким чином, різниця R-L на кожному кроці зменшується, і при досягненні нульового значення (L=R) повторення циклу припиняється.

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

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

Модель – прообраз, опис або зображення якогось об’єкта.

Моделі поділяються на матеріальні та абстрактні (абстрактні поділяються на знакові і вербальні).

Знакові моделі поділяються на математичні та інформаційні, які в свою чергу поділяються на комп’ютерні та некомп’ютерні.

Інформаційна модель – це модель, що описує інформаційні процеси або містить інформацію про властивості і стан об’єктів, процесів, явищ.

Комп’ютерна модель – це модель, реалізована за допомогою програмних засобів.

На ПК можна виконувати розрахунки за будь-якими формулами – у цьому разі йдеться про математичну комп’ютерну модель, якщо ж на ПК переглядаєтсья текст, мультимедійний диск, відтворюється музика, то це комп’ютерна інформаційна модель.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]