Ефективна структура даних карт, що підтримує приблизний пошук


25

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

Редагувати: ще кілька деталей мого конкретного випадку:

  • Струни зазвичай мають досить велику відмінність Левенштейна один від одного.
  • Струни мають максимальну довжину близько 20-30 символів, в середньому ближче до 10-12.
  • Мене більше цікавить ефективний пошук, ніж вставка, оскільки я буду будувати набір здебільшого статичних даних, які хочу ефективно запитувати.

Чи є умови у рядку введення та розмірі кількості елементів на карті? Наскільки ефективним має бути вставлення на карту?
edA-qa mort-ora-y

mrm, наскільки я можу сказати, BK-дерева все ще дивляться на досить велику частину всього дерева. Але це може бути передчасна оптимізація з мого боку?
merijn

3
Тісно пов’язаний з моментом майже повторюваності: Ефективні структури даних для побудови швидкої перевірки орфографії
Рафаель

Відповіді:


18

nO(d)O(d)nO(dϵ)31/ϵnd11

Якщо ви готові враховувати інші відстані, то хеш-чутливість (LSH) чудово працює. Хеш-чутливість до локальності - це техніка, яку впровадили Індік та Мотвані для вирішення проблеми ANNS, де точки, які живуть у просторовому просторі (читайте довгі вектори, довгі рядки тощо), хеширують у невелику кількість відро, так що вказується, що знаходяться поруч один з одним, відображаються в одне сміття з хорошою ймовірністю, а точки, що знаходяться далеко один від одного, відображаються в різні бункери, також з хорошою ймовірністю. Є чудова і дуже доступна стаття опитування Індіка та Андоні в CACM . Ця техніка проста і швидка і має невеликі вимоги до місця; там також є код (я думаю, стаття посилається на код). Це добре працює для таких речей, як відстань Хеммінга (і в певних режимах1 проектують схеми LSH для дуже природного узагальнення відстані редагування, відстані редагування блоку (де деякі операції редагування можуть оперувати блоком символів).

Цей вид питань добре підходить для cstheory.SE . Там є пов’язане питання , але, схоже, запитують точного найближчого сусіда.


12

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

Оскільки проблеми пошуку буквально скрізь є інформатикою, існує величезна кількість різних метричних дерев. Однак їх можна розділити принаймні на дві групи: на основі стрижнів та кластеризації (і, звичайно, є і гібриди). Добре опитування - Е. Чавес та ін., Пошук у метричних просторах, 2001 . Дивіться, наприклад, Розділ 5: Поточні рішення метричних просторів, стор. 283.

Там, у таблиці 1, Чавес та ін. розглянемо 16 різних метричних дерев. Вони представляють складність простору, складність конструкції, складність запиту та додатковий час запиту процесора для кожного (якщо відомо). Якщо ви не надто дбаєте про складність конструкції, складність запиту для BK-дерева єО(нα), де 0<α<1залежно від діапазону пошуку та структури простору. Або якщо у вас немає величезної кількості елементів, подивіться на AESA (наближаючи до усунення алгоритму пошуку). Створювати та зберігати величезні простори неприйнятно повільно (О(н2) час і простір), але експериментально було показано О(1) час запиту.

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

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