Чи можна цей алгоритм вважати алгоритмом двійкового пошуку?


14

Виконуючи другу ката-код (яка просить вас впровадити алгоритм двійкового пошуку п'ять разів, кожен раз за допомогою іншого методу), я придумав дещо інше рішення, яке працює наступним чином:

Якщо у мене буде відсортований масив довжиною 100, і я бачу, що його початкове поле містить число 200, а його кінцеве поле містить число 400, я, як математик, що вивчає людину, швидше за все почав би шукати навколо поля 35, якщо я шукав би число 270, а не поле 50, як у звичайному алгоритмі двійкового пошуку.

Тоді, якщо число в полі 35 масиву дорівнює 270, 35 - це індекс, який я шукав.

Якщо це не так, я можу порівняти отримане число (скажімо, 280) і повторити операцію, беручи нижню частину масиву (тому у мене 35 полів із початковим полем, що містить 200, і кінцевим полем, що містить 280), якщо число, яке я знайшов, є більшим, ніж те, що я шукаю, або верхній частині масиву (скажімо, я отримав 260: зараз у мене 65 індексів, перший містить 260, а останній - 400. Орієнтовно, я б головою повороту індекс 4 цього підмасиву, який є індексом 39 всього масиву), якщо отримане мною число менше, ніж число, яке я шукаю.

Питання в тому, чи можна цей алгоритм вважати бінарним алгоритмом пошуку? Якщо ні, то вона отримала свою назву?


2
Незалежно від того, чи це двійковий пошук, чи ні, це суто питання про думку. По суті, єдина відповідь, яку ви можете дати, це або "Так, це досить близько до двійкового пошуку, щоб назвати його двійковим пошуком", або "Ні, це не так". Аргумент випливає.
Девід Річербі

Відповіді:


23

Я б не назвав це двійковим пошуком.

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

Я вважаю за краще сказати "Найгірший час запуску двійкового пошуку - це O (log (n))", а не "Залежно від вибору елементів, що обмежують, найгіршим часом виконання бінарного пошуку є O (log (n))". Це означає, що я не можу класифікувати пошук інтерполяції як алгоритм двійкового пошуку.


Імовірно, якщо ви вирвете з інтерполяційного пошуку, коли йде погано, ви можете зберегти O (log n) найгірший випадок та O (log n) на досить лінійних даних. Я здогадуюсь, що щось на кшталт "якщо я не знайшов ціль після спроб входу в систему, а потім перейти на двійковий пошук", спрацює, але я лінивий це доводити. Звичайно, буде клас вбивчих входів, для яких це займає в основному вдвічі більше, ніж двійковий пошук.
Стів Джессоп

Ця думка про вбивцю є цікавою. Що робити, якщо замість того, щоб дозволити введенням вбивць негативно впливати на пошук (тобто, розділяючи в кінці масиву), ми обмежуємо / обрізаємо "діапазон, який можна розділити" на 2-ту третину масиву чи подібне. Це було б в гіршому випадку log3 (n), але все ж насолоджуватися найкращим випадком журналу (log).
Ендрю Галлаш

1
@SteveJessop Пам'ятайте, що асимптотична складність не є повною картиною. O (log n) дуже швидкий. Крім того, двійковий пошук робить дуже мало роботи в кожному циклі. Отже, проблема пошуку в Інтерполяції полягає в тому, що вам потрібно дуже довгий вклад, щоб компенсувати той факт, що ви робите більше роботи над кожним циклом. Ваша пропозиція додає до цього більше роботи. Якщо я не зміг прийняти O (n) за неоднорідними даними, я підозрюю, що найкращим рішенням є пошук чистого бінарного пошуку, а не гібридного підходу.
Taemyr

@SteveJessop: Не потрібно перемикати алгоритми; це можна зробити паралельно. Враховуючи діапазон R, ви можете визначити точку P1 як звичайну середину для двійкового пошуку та P2 за допомогою інтерполяції. Тепер у вас є три піддіаграми, жоден з яких не може перевищувати половини початкового діапазону. Перевірте цільове значення проти P1 і P2, і ви знаєте, який із трьох піддіапазонів повторювати.
MSalters

17

O(loglogn)


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

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

@NeilSlater можливо захищає інтерполяційний пошук?
Стів Кокс

@SteveCox: Я просто шукав цей термін і нічого не знайшов. Вирішили задати це як нове запитання: cs.stackexchange.com/questions/59750/…
Ніл Слейтер

-1

Думаю, що правильною термінологією був би обдумуваний психотомічний пошук.

Ви шукаєте в плоскому масиві з подальшим розмірковуванням пошуку на основі передбачуваного плоского розподілу чисел у ньому.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.