Существует ли структура данных, которая принимает неупорядоченный массив из элементов, выполняет предварительную обработку в и отвечает на запросы: есть ли какой-то элемент в списке, каждый запрос в наихудшее время ?O ( n ) x O ( log n )
Я действительно думаю, что нет, поэтому также приветствуется доказательство того, что его нет.
ds.data-structures
sorting
Chi-Lan
источник
источник
Ответы:
Вот доказательство того, что это невозможно. Предположим, вы можете построить такую структуру данных. Построить это. Затем выберите элементов случайным образом из списка, добавьте ϵ к каждому из них, где ϵ меньше разницы между любыми двумя элементами в списке, и выполните запросы, чтобы проверить, присутствует ли какой-либо из полученных элементов в списке. список. Вы уже выполнили O ( n ) запросов.n/logn ϵ ϵ O(n)
Я хотел бы заявить, что проведенных вами сравнений достаточно, чтобы определить, является ли элемент в исходном списке меньше или больше любого нового элемента b . Предположим, вы не могли сказать. Тогда, поскольку это модель, основанная на сравнении, вы не знаете, было ли а равно b или нет, что противоречит предположению о том, что ваша структура данных работает.a b a b
Теперь, поскольку элементов, которые вы выбрали, были случайными, ваши сравнения с высокой вероятностью дали достаточно информации, чтобы разделить исходный список на n / log n списков, каждый из которых имеет размер O ( log n ) . Сортируя каждый из этих списков, вы получаете рандомизированный алгоритм O ( n log log n ) -времени, основанный исключительно на сравнениях, противоречие.n/logn n/logn O ( журналн ) O ( n logжурналн )
источник
Я считаю, что здесь есть другое доказательство, доказывающее невозможность временной структуры запроса с предварительной обработкой O ( n ) .O ( журналКн ) O (n)
Предположим, что в предварительной обработке вы выполняете сравнений, что приводит к частичному порядку.O (n)
Теперь рассмотрим размер самой большой антицепи в этом. Поскольку эти элементы несопоставимы, для того чтобы у нас был алгоритм запроса O ( log k n ) , мы должны иметь A = O ( log k n ) .A O ( журналКн ) A = O ( logКн )
Теперь по теореме Дилворта существует разбиение размера на цепочки.A
Теперь мы можем дополнить алгоритм определения цепочек в разделе. Мы можем определить, сопоставимы ли два элемента, создав ориентированный граф сравнений и выполнив анализ достижимости. Это можно сделать без каких-либо дополнительных сравнений. Теперь просто переберите каждый возможный раздел размера чтобы определить, является ли он разделом цепочек.A
Получив цепочки, мы можем объединить их, чтобы получить алгоритм сравнений для сортировки всего списка.O ( n logжурналн )
источник
Как отмечается в ответе Питера Шора, чтобы исключить членство в модели, основанной на сравнении, нам нужно знать, как этот элемент сравнивается с каждым членом. Таким образом, используя случайных запросов (число членов меньше, чем запрашиваемое число не является случайным), мы получаем Θ ( n log k ) информации относительно наличия n несортированных значений. Следовательно, для некоторой константы c > 0 , используя cк < п Θ (пжурналк ) N с > 0 предварительной обработки, мы не можем иметь ≤ cсжурнал nК стоимость запроса. Это оптимально с точностью до постоянного множителя, поскольку мы можем отсортировать данные по k ′ = k / log k ≤ n / log n приблизительно равным сегментам (каждый сегмент не отсортирован) в O ( n log k ′ ) = O ( n log k ) время, которое позволяет O ( n / k ′ ) стоимость запроса.≤ cжурнал nк / к К'= k / logk ≤ n / logN O ( n logК') = O ( n logк ) O ( н / к')
В частности, используя предварительную обработку, мы не можем иметь o ( n ) стоимость запроса. Кроме того, предварительная обработка o ( n log n ) соответствует k в O ( n ε ) для каждого ε > 0 и, следовательно, Ω ( n 1 - ε ) стоимости запроса.O ( n ) o ( n ) o ( n logн ) К O ( nε) ε >0 Ω ( n1 - ε)
источник