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

34

Существует ли структура данных, которая принимает неупорядоченный массив из элементов, выполняет предварительную обработку в и отвечает на запросы: есть ли какой-то элемент в списке, каждый запрос в наихудшее время ?O ( n ) x O ( log n )nO(n)ИксО(журналN)

Я действительно думаю, что нет, поэтому также приветствуется доказательство того, что его нет.

Chi-Lan
источник
3
(1) Я не знаю, почему вы можете сказать «Конечно, я рассматриваю ожидаемое время», потому что вы вообще не указываете «ожидаемое» в своем вопросе. Пожалуйста, попробуйте более точно сформулировать свой вопрос, прежде чем сказать «конечно». (2) Пожалуйста, определите «не хасируемый».
Tsuyoshi Ito
2
(1) Понятно. Спасибо за объяснение. Если бы кто-то спросил: «Тебя волнует время выполнения?», Тогда ответ был бы действительно «конечно». :) (2) Я думаю, что «Единственное разрешенное действие - это сравнение двух значений в списке» гораздо точнее чем просто сказать «не хэшируемый». Можете ли вы отредактировать вопрос так, чтобы людям не приходилось читать комментарии, чтобы понять, что означает «не хэшируемый»?
Цуёси Ито
3
Кстати, если вы не можете доказать это, почему вы знаете, что это невозможно? Если это упражнение в учебнике или классе, вы спрашиваете на неправильном веб-сайте.
Цуёси Ито
6
Это ваш вопрос: существует ли структура данных, которая принимает неупорядоченный массив из n элементов, выполняет предварительную обработку в O (n) и отвечает на запросы: есть ли какой-то элемент x в списке, каждый запрос в худшее время O (log n)?
sdcvvc
2
@Filip: это легко увидеть? Если это правда, то я согласен, что это решает вопрос.
Цуёси Ито

Ответы:

30

Вот доказательство того, что это невозможно. Предположим, вы можете построить такую ​​структуру данных. Построить это. Затем выберите элементов случайным образом из списка, добавьте ϵ к каждому из них, где ϵ меньше разницы между любыми двумя элементами в списке, и выполните запросы, чтобы проверить, присутствует ли какой-либо из полученных элементов в списке. список. Вы уже выполнили O ( n ) запросов.N/журналNεεО(N)

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

Теперь, поскольку элементов, которые вы выбрали, были случайными, ваши сравнения с высокой вероятностью дали достаточно информации, чтобы разделить исходный список на n / log n списков, каждый из которых имеет размер O ( log n ) . Сортируя каждый из этих списков, вы получаете рандомизированный алгоритм O ( n log log n ) -времени, основанный исключительно на сравнениях, противоречие.N/журналNN/журналNО(журналN)О(NжурналжурналN)

Питер Шор
источник
Несколько советов , чтобы помочь пониманию доказательства (предполагая , что я правильно понимаю себя, конечно): в пункты должны быть заполнены пунктами после ε была добавлена к ним; модель сравнения гарантирует, что вы знаете, какие из случаев a b и a b выполняются; в п / лог п списки в «порядке возрастания»: каждый элемент в любом высшем списке выше , чем каждый элемент в любом нижнем списке; после первоначальных запросов у вас будет достаточно информации, чтобы составить списки вокруг элементов, которые вы выбрали случайным образом,bϵababn/logN
Алекс тен Бринк
(продолжение) обратите внимание, что вам даже не нужно явно составлять список в указанное время, чтобы доказательство имело место.
Алекс тен Бринк
Я не могу понять это доказательство. Последнее противоречие - это «алгоритм, основанный исключительно на сравнениях», но на первых этапах нашего алгоритма мы добавили к каждому элементу (далее «где ϵ меньше, чем разница между любыми двумя элементами в списке»). Почему мы до сих пор оправдываем, что наш алгоритм все еще основан только на сравнении, если мы предполагали, что наши элементы имеют недискретный общий порядок на них? εε
Артем Казнатчеев
5
@Artem: Ваш оригинальный вход состоит из элементов . Затем вы строите новое множество X = X × { 0 , 1 } ; Вы представляете исходный x X как ( x , 0 ) X ′, а модифицированный x + ϵ как ( x , 1 ) X . Теперь вы используете алгоритм черного ящика; алгоритм сравнивает элементы X ИксИксИкс'знак равноИкс×{0,1}ИксИкс(Икс,0)Икс'Икс+ε(Икс,1)Икс'Икс'друг другу; Чтобы ответить на такие запросы, вам нужно только сравнить постоянное количество элементов друг с другом. Следовательно, все должно быть выполнимо в модели сравнения с постоянными издержками. Икс
Юкка Суомела
1
@ Арьябхата: это так. Что такое алгоритм ? О(журнал2N)
Питер Шор
24

Я считаю, что здесь есть другое доказательство, доказывающее невозможность временной структуры запроса с предварительной обработкой O ( n ) .О(журналКN)O(n)

Предположим, что в предварительной обработке вы выполняете сравнений, что приводит к частичному порядку.O(n)

Теперь рассмотрим размер самой большой антицепи в этом. Поскольку эти элементы несопоставимы, для того чтобы у нас был алгоритм запроса O ( log k n ) , мы должны иметь A = O ( log k n ) .AO(logkn)Aзнак равноО(журналКN)

Теперь по теореме Дилворта существует разбиение размера на цепочки.A

Теперь мы можем дополнить алгоритм определения цепочек в разделе. Мы можем определить, сопоставимы ли два элемента, создав ориентированный граф сравнений и выполнив анализ достижимости. Это можно сделать без каких-либо дополнительных сравнений. Теперь просто переберите каждый возможный раздел размера чтобы определить, является ли он разделом цепочек.A

Получив цепочки, мы можем объединить их, чтобы получить алгоритм сравнений для сортировки всего списка.О(NжурналжурналN)

Арьябхата
источник
1
Это хорошая идея. И если бы вы могли показать, что цепочечный раздел должен быть известен алгоритму, то вы могли бы использовать mergesort, чтобы показать, что для сортировки всего ввода потребуется только O (n log log n), а не Дженсен. Но есть проблема: почему алгоритм предварительной обработки должен создавать цепное разбиение? Да, цепное разбиение должно существовать, но это сильно отличается от того, что известно алгоритму.
Дэвид Эппштейн
8
Хорошо, теперь я верю этому доказательству. И это еще более убедительно показывает, что для достижения времени запроса полилога вы должны использовать ряд сравнений, которые находятся в аддитивном сортировки. Ницца. Кстати, раздел цепочки может быть найден за полиномиальное время из набора уже выполненных сравнений, вместо того, чтобы искать перебор, но это не имеет никакого значения для вашего аргумента. O(nloglogn)
Дэвид Эппштейн
6
Доказательства на самом деле показывают, что вы должны иметь либо предварительной обработки, либо Ω ( n ) для каждого запроса. Конечно, оба жесткие. Это показывает, что бинарный поиск и линейный поиск являются единственными «интересными» алгоритмами поиска (по крайней мере, в классическом мире). Ω(nlogn)Ω(n)
Yuval Filmus
1
@Yuval: может быть, вы должны записать это наблюдение как фактический ответ, потому что мне кажется, что вы должны сделать умеренный объем работы, чтобы получить вышеуказанный результат из доказательств в ответах.
Питер Шор
1
@Yuval: думая о доказательствах, я только вижу, что у вас должна быть либо предварительная обработка либо время запроса Ω ( n 1 - ϵ ) для всех ϵ . Можно иметь O ( п войти п ) Preprocessing времени и O ( п / входе п ) время запроса. Можно разделить список на log n списков размером n / log n каждый за время θ ( nΩ(NжурналN)Ω(N1-ε)εо(NжурналN)О(N/журналN)журналNN/журналN с помощью повторного нахождения медианы. θ(NжурналжурналN)
Питер Шор
0

Как отмечается в ответе Питера Шора, чтобы исключить членство в модели, основанной на сравнении, нам нужно знать, как этот элемент сравнивается с каждым членом. Таким образом, используя случайных запросов (число членов меньше, чем запрашиваемое число не является случайным), мы получаем Θ ( n log k ) информации относительно наличия n несортированных значений. Следовательно, для некоторой константы c > 0 , используя cК<NΘ(nlogk)nc>0 предварительной обработки, мы не можем иметьccnlogК стоимость запроса. Это оптимально с точностью до постоянного множителя, поскольку мы можем отсортировать данные по k = k / log k n / log n приблизительно равным сегментам (каждый сегмент не отсортирован) в O ( n log k ) = O ( n log k ) время, которое позволяет O ( n / k ) стоимость запроса.cnlogk/КК'знак равноК/журналКN/журналNО(NжурналК')знак равноО(NжурналК)О(N/К')

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

Дмитрий Тарановский
источник