Інтерполяційний пошук проти двійкового пошуку


13

Коли я повинен використовувати інтерполяційний пошук замість двійкового пошуку?

Наприклад, у мене є відсортований набір даних, у яких ситуаціях я б використовував двійковий пошук, щоб знайти предмет у цьому наборі даних або в якій ситуації слід використовувати інтерполяційний пошук?

Які властивості набору даних будуть визначальним фактором?

Відповіді:


12

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

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

Наприклад, розгляньте набір даних із рядками малих літер як ключі. Припустимо, у вас є ключ, який починається з "х". Інтерполяційний пошук чітко вказує на те, що слід починати пошук дуже близько до кінця набору. Якщо, однак, більшість ваших ключів насправді починається з 'z', і майже жодна не має нічого з 'a', хоча 'y', той, який ви шукаєте, насправді може бути дуже близьким до початку набору. Це може / може зайняти значну кількість ітерацій, перш ніж пошук наблизиться до початку, де розташовується рядок, що починається з 'w'. Кожна ітерація видалила б з уваги лише ~ 10% набору даних, тому знадобиться кілька ітерацій, перш ніж вона наблизиться до початку, де ключі починаються з 'w'

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

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

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


1
Проблема, яку ви описуєте, легко вирішується за допомогою використання першого та останнього елементів для визначення діапазону замість того, щоб вважати Int.MIN_VALUE та Int.MAX_VALUE, що я вважаю (принаймні так я дізнався алгоритм) - це як це зробити більшість.
Мальфіст

2
@Malfist: Це може допомогти, але не обов'язково виправить проблему. У прикладі, якби у вас були нульові ключі, починаючи з чогось (скажімо) 'a' через 'q', інтерполяція проходитиме досить гладко. Однак, один, який почався з цього a, завдав би шкоди продуктивності.
Джеррі Труну

1

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

З Вікіпедії про пошук інтерполяції:

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

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

Структури індексів, такі як B-дерева, також зменшують кількість доступу до диска і частіше використовуються для індексації даних на диску частково, оскільки вони можуть індексувати багато типів даних і можуть оновлюватися в Інтернеті. Однак інтерполяційний пошук може бути корисним, коли змушений шукати певні сортовані, але недекларовані набори даних на диску.


0

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

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

Двійковий пошук працює для рядків чи чисел, якщо вони зберігаються в упорядкованому порядку. Основна ідея бінарного пошуку полягає в тому, що він заснований на вивченні середнього елемента. Інтерполяційний пошук - це варіант. Замість використання точного середнього елемента він здогадується, де наступний елемент для порівняння з переданим значенням. Детальну інформацію про те, як алгоритм пошуку інтерполяції обчислює наступне значення ключа, перегляньте посилання, що надається у відповіді JB Кінга або нижче.

"Інтерполяційний пошук працює лише на числових елементах, розташованих у порядку відсортованих масивів з рівномірним розподілом (тобто інтервал між будь-якими та послідовними елементами є приблизно постійним" (цитата із посилання нижче P 737, також включено порівняння продуктивності між різними лінійними методами пошуку ).

Google Книги - класичні структури даних 2-е вид.

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