Структура даних на основі порівняння для пошуку елементів


34

Чи є структура даних, яка займає не упорядкований масив з елементів, виконує попередню обробку в та відповідає на запити: чи є в списку якийсь елемент , кожен запит у гірший час ?O ( n ) x O ( журнал n )nO(n)xO(logn)

Я дійсно думаю, що цього немає, тому доказ того, що такого немає, також вітається.


3
(1) Я не знаю, чому ви можете сказати: "Звичайно, я вважаю очікуваний час", оскільки ви взагалі не вказуєте "очікуваного" у своєму запитанні. Будь ласка, спробуйте викласти своє запитання точніше, перш ніж сказати "звичайно". (2) Будь ласка, визначте "непридатний".
Tsuyoshi Ito

2
(1) Бачу. Дякую за пояснення. Якщо хтось запитав "Чи тобі хвилюється час роботи?", То відповідь була б "звичайно". :) (2) Я думаю, що "Єдина дозволена дія - порівняння двох значень у списку" набагато точніша а не просто зазначити "непридатне". Чи можете ви відредагувати питання, щоб людям не довелося читати коментарі, щоб зрозуміти, що означає "непридатне для переміщення"?
Tsuyoshi Ito

3
До речі, якщо ви не можете цього довести, чому ви знаєте, що це неможливо? Якщо це вправа в підручнику чи класі, ви запитуєте на неправильному веб-сайті.
Tsuyoshi Ito

6
Це ваше запитання: чи існує структура даних, яка займає не упорядкований масив з n елементів, виконує попередню обробку в O (n) і відповідає на запити: чи є якийсь елемент x у списку, кожен запит у найгірший час O (log n)?
sdcvvc

2
@Filip: Це легко помітити? Якщо це правда, то я згоден, що це вирішує питання.
Цуйоші Іто

Відповіді:


30

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

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

Тепер, оскільки вибрані вами елементи були випадковими, ваші порівняння з великою ймовірністю дали достатню інформацію для поділу вихідного списку на n / log n списків кожного розміру O ( log n ) . При сортуванні кожної з цих списків, ви отримуєте рандомізоване O ( п лог журналу п ) -час сортування алгоритм , що базується виключно на порівняннях, протиріччя.n/lognn/lognO(logn)O(nloglogn)


Кілька натяків, які допоможуть зрозуміти доказ (якщо я зрозумів, що я його правильно зрозумів): пункти повинні бути заповнені предметами після того, як до них додано ϵ ; модельні гарантії порівняння ви знаєте , який з випадків б і б трюмів; в п / лог п списки в «порядку зростання»: кожен елемент в будь-якому вищому списку вище , ніж кожен елемент в будь-якому нижньому списку; після оригінальних запитів у вас є достатня інформація, щоб скласти списки навколо предметів, які ви вибрали випадковим чином,bϵababn/logn
Alex ten Brink

(продовження) зауважте, що вам навіть не потрібно явно бути в змозі скласти список у встановлений час для підтвердження.
Алекс десять Брінк

Я не тихо розумію це підтвердження. Остаточне протиріччя вимкнено "алгоритмом, заснованим виключно на порівняннях", але на перших кроках нашого алгоритму ми додали до кожного елемента (далі, "де ϵ менше, ніж різниця між будь-якими двома пунктами у списку"). Чому ми все-таки виправдовуємося тим, що наш алгоритм все ще лише на основі порівняння, якщо ми припускаємо, що наші предмети мають недискретний загальний порядок на них? ϵϵ
Артем Казнатчеєв

5
@Artem: Ваш оригінальний вхід складається з елементів . Тоді ви будуєте новий набір X = X × { 0 , 1 } ; ви представляєте оригінал x X як ( x , 0 ) X і модифікований x + ϵ як ( x , 1 ) X . Тепер ви використовуєте алгоритм чорного поля; алгоритм порівнює елементи X xXX=X×{0,1}xX(x,0)Xx+ϵ(x,1)XXодин одному; щоб відповісти на такі запити, потрібно лише порівняти постійну кількість елементів один з одним. Отже, все повинно бути виконано в моделі порівняння, з постійними накладними витратами. X
Jukka Suomela

1
@Aryabhata: так. Що таке алгоритм ? O(log2n)
Пітер Шор

24

Я вважаю, що це інший доказ, що підтверджує неможливість структури часу запиту з попередньою обробкою O ( n ) .O(logkn)O(n)

Припустимо, що при попередній обробці ви робите зіставлення, що призводить до часткового порядку.O(n)

Тепер розглянемо розмір найбільшого антихаїну в цьому. Оскільки ці елементи не порівнянні, для нас є алгоритм запиту O ( log k n ) , ми повинні мати, що A = O ( log k n ) .AO(logkn)A=O(logkn)

Тепер за теоремою Ділворта існує розподіл розміру на ланцюги.А

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

Після того, як ми маємо ланцюга, ми можемо об'єднати їх , щоб дати порівняння алгоритм сортування весь список.O(nloglogn)


1
Це гарна ідея. І якщо ви могли б показати, що алгоритм повинен бути відомий ланцюговий розділ, то ви можете використовувати mergesort, щоб показати, що для сортування всього входу буде потрібно лише додаткове порівняння O (n log n), а не використання Jensen. Але є проблема: чому алгоритм попередньої обробки повинен будувати розділ ланцюга? Ланцюг-розділ повинен існувати, так, але це дуже відрізняється від відомого алгоритму.
Девід Еппштейн

8
Гаразд, я зараз вважаю це доказом. І це показує більш сильно , що для досягнення полілог часу запиту ви повинні використовувати ряд порівнянь в межах адитивної сортуванні. Приємно. До речі, ланцюговий розділ може бути знайдений у багаточлени з набору вже проведених порівнянь, замість того, щоб вимагати грубої сили, але це не має ніякого значення для вашого аргументу. O(nloglogn)
Девід Еппштейн

6
Докази фактично показують, що для кожного запиту ви повинні мати або обробку або Ω ( n ) . Звичайно, обидва тісні. Це показує, що двійковий пошук та лінійний пошук - єдині «цікаві» алгоритми пошуку (принаймні, у класичному світі). Ω(nlogn)Ω(n)
Yuval Filmus

1
@ Ювал: можливо, ви повинні записати це спостереження як фактичну відповідь, тому що мені здається, що вам доведеться виконати помірний обсяг роботи, щоб отримати вищезазначений результат із доказів у відповідях.
Пітер Шор

1
@Yuval: думаючи про докази, я бачу лише, що ви повинні мати або попередню обробку або Ω ( n 1 - ϵ ) час запиту для всіх ϵ . Можливо мати o ( n log n ) час попередньої обробки та O ( n / log n ) час запиту. Можна розділити список на журнали n списки розміру n / log n кожен раз θ ( nΩ(nlogn)Ω(n1ϵ)ϵo(nlogn)O(n/logn)lognн/журналн за допомогою повторного медіанного знаходження. θ(нжурналжурналн)
Пітер Шор

0

Як зазначається у відповіді Пітера Шор, щоб виключити членство в моделі порівняння, ми повинні знати, як елемент порівнюється з кожним членом. Таким чином, використовуючи випадкових запитів (кількість членів, менша від запитуваного нечлену, є випадковою), ми отримуємо Θ ( n log k ) інформацію стосовно того, що маємо n несортованих значень. Тому для деякої постійної c > 0 , використовуючи ck<nΘ(nlogk)nc>0 попередньої обробки, ми не можемо матиccnlogk вартість запиту. Це оптимально до постійного коефіцієнта, оскільки ми можемо сортувати дані за k = k / log k n / log n приблизно рівними відрами (кожне відро несортовано) в O ( n log k ) = O ( n log k ) час, що дозволяєвитратити запит на O ( n / k ) .cnlogk/kk=k/logkn/lognO(nlogk)=O(nlogk)О(н/к')

Зокрема, використовуючи попередню обробку, ми не можемо мати o ( n ) вартість запиту. Крім того, попередня обробка o ( n log n ) відповідає k в O ( n ε ) для кожного ε > 0 і, таким чином, вартість запиту Ω ( n 1 - ε ) .О(н)о(н)о(нжурналн)кО(нε)ε>0Ω(н1-ε)

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