
Практичне заняття №4 Тема: Пошукові алгоритми. План практичного заняття
Практичне заняття №4 1
Тема: Пошукові алгоритми. 1
Послідовний (лінійний) пошук 2
Бінарний пошук 2
Метод інтерполяції 4
Метод „золотого перерізу” 5
Алгоритми пошуку послідовностей 5
Прямий алгоритм пошуку 6
Алгоритм Кнута, Моріса, Пратта 6
Алгоритм Боуєра та Мура 8
Реалізувати алгоритми лінійного і бінарного пошуків
У введеному масиві даних знайти два найменших елементи
Вводиться послідовність із N натуральних чисел. Необхідно визначити найменше натуральне число, яке відсутнє у послідовності.
На перфострічці записані N попарно різних додатних чисел. Ваша ЕОМ може перемотувати стрічку на початок і зчитувати число одне за одним. Внутрішня пам’ять комп’ютера може зберігати тільки декілька цілих чисел. Необхідно знайти найменше додатне ціле число, якого немає на стрічці. Опишіть алгоритм, який зробить це за найменшу кількість кроків.
На столі у двох стовпчиках лежать 64 золотих і 64 срібних монети відповідно. Як срібні, так і золоті монети впорядковані у порядку спадання мас. Маси всіх монет різні. Яку найменшу кількість зважувань необхідно для визначення шістдесят четвертої монети в порядку убування мас серед всіх 128 монет? За один раз можна зважувати дві монети і визначити, яка з них важче. Відповідь обгрунтувати.
Задано N наборів монет з різних країн. Набори впорядковані за неспаданням маси монет. У i-му наборі ai монет. Необхідно за мінімальне число зважувань на вагах визначити к-ту за масою монету серед усіх монет.
Пошукові алгоритми
Одна з тих дій, які найбільш часто зустрічаються в програмуванні – пошук. Існує декілька основних варіантів пошуку, і для них створено багато різноманітних алгоритмів.
Задача пошуку – відшукати елемент, ключ якого рівний заданому „аргументу пошуку”. Отриманий в результаті цього індекс забезпечує доступ до усіх полів виявленого елемента.
Послідовний (лінійний) пошук
Найпростішим методом пошуку елемента, який знаходиться в неврегульованому наборі даних, за значенням його ключа є послідовний перегляд кожного елемента набору, який продовжується до тих пір, поки не буде знайдений потрібний елемент. Якщо переглянуто весь набір, і елемент не знайдений – значить, шуканий ключ відсутній в наборі. Цей метод ще називають методом повного перебору.
Для послідовного пошуку в середньому потрібно N/2 порівнянь. Таким чином, порядок алгоритму – лінійний – O(N).
Програмна ілюстрація лінійного пошуку в неврегульованому масиві приведена в наступному прикладі, де a – початковий масив, key – ключ, який шукається; функція повертає індекс знайденого елемента.
int LinSearch(int *a, int key)
{
int i = 0;
while ( (i<N) && (a[i] != key) )
i++;
return i;
}
Якщо елемент знайдено, то він знайдений разом з мінімально можливим індексом, тобто це перший з таких елементів. Рівність i=N засвідчує, що елемент відсутній.
Єдина модифікація цього алгоритму, яку можна зробити, – позбавитися перевірки номера елементу масиву в заголовку циклу (i<N) за рахунок збільшення масиву на один елемент у кінці, значення якого перед пошуком встановлюють рівним шуканому ключу – key – так званий „бар’єр”.
int LinSearch(int *a, int key)
{
a[N] = key;
i = 0;
while (a[i] != key)
i++;
return i; // i<N – повернення номера елемента
}