Пошук у масиві Нехай масив k [1], k [2], …, k [n] та змінна v мають однаковий тип. Пошук за ключем полягає в пошуку номера i такого, що k [i] = v . Розглянемо два алгоритми: - пошук “підряд” у невпорядкованій послідовності; - пошук у впорядкованому масиві. Лінійний пошук Передбачає послідовний перегляд всіх елементів масиву поки не знайдемо елемент, що дорівнює v . Оцінимо час пошуку. Терміном елементарна дія узагальнимо присвоювання та операції над скалярними даними. Припустимо, що на виконання елементарної дії витрачається однаковий проміжок часу, незалежний від конкретних операндів. Тоді час виконання програми прямо пропорційний кількості елементарних дій.
Приклад #include < stdio.h > main() { int k[100], v, i; for (i=0; i<100; i++) scanf ("%d", &k[i]); scanf ("%d", &v); i=0; while (k[i]!=v && i<100) i++; if (k[i]==v) printf ("%d %d", v, i); else printf ("%d не найден", v); }
При лінійному пошуку кількість елементарних дій прямо пропорційна кількості порівнянь k[i]==v . В найгіршому випадку з ключем порівнюються всі елементи масиву. Звідси – найбільший час виконання алгоритму прямо (лінійно) пропорційний n , і найбільший час пошуку t є лінійною функцією від n . Лінійну залежність часу від кількості елементів будемо позначати t = O (n) . Бінарний пошук . Необхідно мати відсортований масив. Нехай значення елементів масиву упорядковані за зростанням, тобто k [1] <= k[2] <= …<= k[n] . Ключ v порівнюється з елементом всередені масиву. Якщо результат хибний, пошук продовжується в одній з двох половин масиву.
Приклад: n - парне, елемент v в масиві існує #include < stdio.h > main() { int k[100], v, i, j, m; for (i=0; i<100; i++) scanf ("%d", &k[i]); scanf ("%d", &v); i=0; j=100; m=50; while (k[m]!=v) { if (k[m] < v) i+=m; else j=m-i; m=(i+j)/2; } printf ("%d %d", v, m); }
Кожного разу простір пошуку зменшується приблизно вдвічі. Такий пошук ще називають двійковим, або дихотомічним (дихотомія – це поділ на дві половини). Загальна кількість дій прямо пропорційна кількості повторень циклу while . Але за кожного повторення m зменшується у два рази. Час виконання алгоритму t = O ( log 2 n) Чим більше n, тим більше відношення n до log 2 n . Наприклад, за n=10000 це більше 500 . В реальних задачах різниця між лінійним і бінарним пошуком дуже відчутна. Складність задачі пошуку в упорядкованому масиві визначається складністю алгоритму бінарного пошуку і оцінюється функцією log 2 n .