Виберіть два числа, які дорівнюють , використовуючи підлінійний час запиту


9

Ось проблема найближчого сусіда.

З огляду на реальні (дуже великий !) Плюс цільовий реальний , знайдіть та , SUM яких найближчий до . Ми дозволяємо розумну попередню обробку / індексацію (до ), але під час запиту (заданий ) результат повинен бути повернутий дуже швидко (наприклад, час).a1,,annpaiajpa1,,anO(nlogn)pO(logn)

(Простіший приклад: якщо ми хотіли, щоб єдиний єдиний був найближчим до , ми відсортуємо офлайн, , а потім зробимо двійковий пошук під час запиту, ).aipa1,,anO(nlogn)O(logn)

Рішення, які не працюють:

1) Сортуйте офлайн, потім у час запиту почніть з обох кінців і перемістіть два покажчики всередину ( http://bit.ly/1eKHHDy ). Не добре, оскільки час запиту.a1,,anO(n)

2) Сортуйте офлайн, а потім під час запиту візьміть кожну та виконайте двійковий пошук "приятеля", який допомагає їй підбити щось близьке до . Не добре, через час запиту .a1,,anaipO(nlogn)

3) Сортувати всі пари режимі офлайн, а потім виконати двійковий пошук. Не добре, тому що попередня обробка.(a1,,an)O(n2)

Дякую!

пс. Подальші узагальнення, необхідні для практики: (1) і щоб бути 50-мірними векторами, (2) "близько" бути векторною косинусою відстані, і (3) -найбільше найближчих пар - сума-сума, не просто 1-кращий.a1,,anpk


Чи є обмеження на час попередньої обробки або кількість місця, яке ми можемо використати після попередньої обробки? Якщо ми обмежені простором , чи є у вас підстави вважати, що це може бути вирішено в скажімо, час? Це здається мені жахливо малоймовірним. O(n)O(lgn)
DW

Попередня обробка обмежена O ( log ). Я оновив заяву про проблему. nn
Кевін

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

Відповіді:


17

Це майже напевно неможливо.

Припустимо, ви могли вирішити свою проблему за допомогою попередньої обробки часу та часу запиту . Тоді існує простий алгоритм для вирішення задачі 3SUM - Дайте набір реальних чисел, чи всі три елементи дорівнюють нулю? —В час. Ми попередньо обробляємо всі числа, потім для кожного числа знаходимо значення яке найближче до ; якщо він точно відповідає , ми знайшли рішення проблеми 3SUM.P(n)Q(n)nP(n)+nQ(n)akai+ajakak

Однак найшвидший алгоритм, відомий для 3SUM, працює за час , і цей алгоритм широко вважається оптимальним. Більше того, в обмеженій, але природної моделі дерева обчислень існує нижня межа відповідності . Для множин цілих чисел , існує кілька алгоритми subquadratic часу , що «грати в ігри з битами», але навіть в моделі RAM цілого, 3SUM Передбачає вимагати час .O(n2)Ω(n2)Ω(n2/polylogn)

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


2

Якщо ви можете використовувати необмежений простір та необмежений час під час попередньої обробки, то наступне рішення відповідає вашим вимогам:

  • Під час попередньої обробки обчисліть набір і збережіть цей набір у відсортованому порядку. Цей набір можна генерувати та сортувати за часом , і для його зберігання потрібен простір .{ai+aj:1ijn}O(n2)O(n2)

  • Тепер, щоб відповісти на запит (щоб знайти де максимально наближений до ), просто зробіть двійковий пошук у цьому відсортованому списку. Це займе час.ai,ajai+ajpO(lgn)

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


Привіт, і дякую! Але ваше рішення те саме, що і моє рішення №3, що проблематично через час попередньої обробки O (n ^ 2). У моєму випадку n дуже великий (наприклад, 1м), і я повинен уникати операцій O (n ^ 2).
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.