Чи є якесь дослідження чи теорія, що стоїть за поєднанням бінарного пошуку та інтерполяційного пошуку?


14

Я щойно прочитав Чи може цей алгоритм ще вважатися алгоритмом двійкового пошуку? і нагадав, що кілька років тому я написав індексатор / пошук файлів журналів, щоб знайти записи журналу у великих звичайних текстових файлах за вікном дати / часу.

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

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

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

Я натрапив на відому річ? Чи існує якесь теоретичне обгрунтування того, що воно швидше для певних типів даних? Файли журналів зазвичай були великими для того часу (наприклад, 1-2 ГБ тексту з можливо 10 мільйонами рядків для пошуку), а розповсюдження в них дат / часів було складним із великими сплесками активності, загальними піковими і тихими часами. Мої тестові показники відібрані з рівномірного розподілу цільового часу, щоб знайти.

Відповіді:


5

Я натрапив на відому річ?

О(лог лог н)О(лог н)

  • Інтроспективний пошук - це ваш метод (ітерація між інтерполяційним пошуком і бінарним пошуком). Я не маю більше деталей.
  • Інтерполяційно-бінарний пошук (IBS) Н. Санторо, Дж. Б. Сідні (1985).

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

    Це має багато спільних моментів з вашим підходом.

  • Адаптивний пошук (AS): Біаджо Бонасера, Еміліо Феррара, Джакомо Фіумара, Франческо Пагано, Алессандро Проветті

    Використовуючи слова авторів:

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

    [CUT]

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

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


6

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

Хоча теоретично швидше, інтерполяційний пошук має два недоліки порівняно з двійковим пошуком:

  • Він має жахливі (лінійні) найгірші показники

  • Витрати на обчислення середини досить великі; ітерація двійкового пошуку в сотні разів швидша, ніж інтерполяційна

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

журналнжурналжурналнжурналнжурналжурналн

Я думаю, що ваші результати можна пояснити двома явищами:

  • Поєднання з двійковим пошуком дозволяє уникнути гіршої поведінки

  • Позитивний ефект від переходу до двійкового пошуку на невеликому наборі даних


3
Ви писали: "Ітерація двійкового пошуку в сотні разів швидша, ніж інтерполяційна." Зауважте, що у випадку ОП різниця між обчисленням середньої точки в цих двох методах зменшується часом введення / виводу, необхідним для отримання значення середньої точки.
liori

@liori: Ранні кілька ітерацій повторних двійкових пошуків на одних і тих же даних можуть бути більш зручними для кешу, тому що використовуються ті ж самі елементи. Тож можна чекати, що чверть і восьма частина залишаються гарячими в кеш-пам'яті. Починати з двійкового та переходити до інтерпольованого після трьох ітерацій може мати сенс, якщо діапазони будуть досить великими. (Або якщо ви можете виконати асинхронізацію вводу / виводу та використовувати той, який результат набере першим).
Пітер Кордес

Крім того, навіть для пошуку в пам'яті помилка кешу (затримка понад 200 циклів) у кілька разів перевищує затримку навіть 64-бітового цілого поділу (32-96циклів), наприклад, у Intel Haswell . 32-бітове ціле ділення значно швидше (22-29цикл). Пропускна здатність основної пам’яті - це спільний ресурс для всіх ядер, але для цілого поділу використовуються лише ресурси, дубльовані на кожному ядрі.
Пітер Кордес

2
Однак затримка пам’яті набагато гірша, ніж пропускна здатність пам’яті, оскільки навіть багаторазовий розсіяний доступ йде швидше, якщо вони одразу в польоті. Це виграв попередній вибір (з prefetcht0інструкціями ) обидві можливості для наступної ітерації перед завантаженням поточної середини, для огляду пам'яті на сучасному обладнанні x86. Ви не можете цього зробити, якщо не зможете передбачити наступні адреси отримання раніше. Тож практичні деталі реалізації можуть бути істотними, крім теоретичних міркувань .
Пітер Кордес

@liori: Однозначно введення / виведення на середину точки було головним фактором при індексації файлу журналу, оскільки він читався на вимогу, щоб знайти записи. Мабуть, було більше двох порядків між обчисленням зміщення у файлі та зчитуванням блоку, тому вирішальним фактором буде кількість обчислених середніх точок. Я думаю, якщо я повторюю зараз без файлу журналу, щоб індексувати - щось, що я спробую і розміщу тут, - може бути не вимірювана різниця швидкості, але може бути відмірна різниця "кількість потрібних серединних точок".
Ніл Слейтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.