Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритми та структури даних ЗПІ-91-20210115T104612Z-001 / Лекція 10. Алгоритми пошуку.docx
Скачиваний:
38
Добавлен:
15.01.2021
Размер:
60.92 Кб
Скачать

153

Лекція 10. Алгоритми пошуку

1. Лінійний пошук

2. Двійковий (бінарний) пошук

1. Лінійний пошук

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

Алгоритм має лінійну складність: O(n).

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

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

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

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

Розглянемо деякі приклади реалізації алгоритму лінійного пошуку у масиві елементів.

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

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

Формальний запис алгоритму:

1. Визначити елемент, який шукаємо key;

2. Встановити границі області пошуку L, R для масиву A [a];

3. Якщо аi = key – елемент знайдено;

4. Інакше – переходимо до наступного елементу.

Наступний приклад демонструє 3 різні методи пошуку, реалізовані у класі LinearSearch. Кожний з методів приймає у якості аргументів масив, кількість елементів, серед яких потрібно шукати елемент, шуканий елемент.

Приклад 1. Лінійний пошук на мові С#

namespace Lab 7

{

class LinearSearch

{

public int NotFoundResult = -1;

public int LinearSearch1(int[] array, int count, int x)

{

//метод проходить по всім елементам масиву і в результаті повертає номер //(індекс) останнього шуканого елемента. Цей алгоритм можна модифікувати //так, щоб знайти кількість шуканих елементів.

int result = NotFoundResult;

for (int index = 0; index < array.Length; index++)

{

if (array[index] == x)

{

result = index;

}

}

return result;

}

//--------------------

public int LinearSearch2(int[] array, int count, int x)

{

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

for (int index = 0; index < array.Length; index++)

{

if (array[index] == x)

{

return index;

}

}

return NotFoundResult;

}

//-------------------------

public int LinearSearch3(int[] array, int count, int x)

{

//третій метод використовує допоміжну змінну last, якій призначається

//значення останнього елементу масиву, а останньому елементу

//призначається значення шуканого елементу.

int last = array[count - 1];

array[count - 1] = x;

int index = 0;

//в циклі шукається перший потрібний елемент

while (array[index] != x)

{

index++;

}

array[count - 1] = last; //останній елемент масиву

//якщо елемент був знайлений у циклі або це останній елемент

// виконуємо вихід з методу і повертаємо номер першого знайденого елемента

if (index < count - 1 || array[count - 1] == x)

{

return index;

}

return NotFoundResult;

}

}

}

Наступний приклад також реалізує алгоритм лінійного пошуку. Пошук виконується до знаходження першого елемента у масиві, який задовольняє умові пошуку. Для виходу з циклу використовується оператор break.