Основы объектно-ориентированного программирования на языке C# book | Page 39

2.3 Складнiсть задач Oцiнимо алгоритм бiнарного пошуку ключа в упорядкованому ма- сивi. Суть алгоритму: розглядаємо серединний елемент масиву й пе- ревiряємо вiдповiднiсть ключа до його значення. Якщо не вдається знайти вiдповiднiсть, то порiвнюємо ключ i значення серединного еле- мента, а потiм перемiщаємося в нижню половину списку елементiв масиву, якщо ключ менше, i верхню – якщо бiльше. В обранiй поло- винi знову шукаємо середину та знову порiвнюємо iз ключем. Якщо не виходить, то знову дiлимо надвоє поточний iнтервал. Розглянемо детальнiше алгоритм. Вхiд: low, high – змiннi, що за- дають нижню й верхню межi масиву, key – шукане число. 1. поки low ≤ high виконувати 2. початок 3. mid = (low + high)/2; 4. data = a[mid]; 5. якщо key = data 6. тодi початок search = mid; закiнчити роботу кiнець 7. iнакше якщо key < data 8. то high = mid − 1 9. iнакше low = mid + 1; 10. кiнець; 11. search = −1; Перша iтерацiя циклу має справу з усiм списком елементiв. Ко- жна подальша iтерацiя дiлить список навпiл. Наприклад, розмiрами спискiв для послiдовних крокiв алгоритму є n, n/2, n/2 2 , ... n/2 m . Урештi–решт знайдеться таке цiле m, що n/2 m < 2 або n < 2 m+1 . Oскiльки m – перше цiле, для якого n/2 m < 2, то має бути вiрним n/2 m − 1 ≥ 2 або 2 m ≤ n. Iз цього випливає, що 2 ≤ n < 2 m + 1. Вiзьмемо логарифм кожноı̈ частини нерiвностi й дiстанемо m ≤ log 2 (n) = x < m + 1. Значення m – найбiльше цiле, що менше або дорiвнює x. Oтже, складнiсть дорiвнює O(n log 2 n). Знайдемо вираз для часу, що необхiдний програмi для обробки ма- сиву з N елементами як функцiю вiд N . Зазвичай нас цiкавить сере- днiй випадок – очiкуваний час роботи програми на типових вхiдних даних, i гiрший – очiкуваний час роботи програми на найгiрших вхi- дних даних. Через труднощi, пов’язанi з проведенням аналiзу часовоı̈ складностi алгоритму в середньому, часто доводиться задовольнятися оцiнками 39