Vergleichsbasierte Datenstruktur zum Auffinden von Artikeln


34

Gibt es eine Datenstruktur, die ein ungeordnetes Array von Elementen annimmt , eine Vorverarbeitung in und Abfragen beantwortet: Befindet sich ein Element in der Liste, jede Abfrage in der schlechtesten Zeit ?O ( n ) x O ( log n )nO(n)xO(logn)

Ich denke wirklich, dass es keinen gibt. Ein Beweis dafür, dass es keinen gibt, ist auch willkommen.


3
(1) Ich weiß nicht, warum Sie "Natürlich berücksichtige ich die erwartete Zeit" sagen können, weil Sie in Ihrer Frage überhaupt nicht "erwartet" angeben. Bitte versuchen Sie, Ihre Frage genauer zu formulieren, bevor Sie "natürlich" sagen. (2) Definieren Sie "nicht hashbar".
Tsuyoshi Ito

2
(1) Ich verstehe. Danke für die Erklärung. Wenn jemand gefragt wird, ob Ihnen die Laufzeit wichtig ist, lautet die Antwort in der Tat „natürlich“. :) (2) Ich denke, dass „die einzig zulässige Aktion darin besteht, zwei Werte in der Liste zu vergleichen“, viel präziser ist Können Sie die Frage so bearbeiten, dass die Benutzer die Kommentare nicht lesen müssen, um zu verstehen, was "nicht hashbar" bedeutet?
Tsuyoshi Ito

3
Übrigens, wenn Sie es nicht beweisen können, warum wissen Sie, dass es unmöglich ist? Wenn es sich um eine Übung in einem Lehrbuch oder einer Klasse handelt, fragen Sie auf einer falschen Website.
Tsuyoshi Ito

6
Ist dies Ihre Frage: Gibt es eine Datenstruktur, die ein ungeordnetes Array von n Elementen annimmt, eine Vorverarbeitung in O (n) durchführt und Abfragen beantwortet: Befindet sich ein Element x in der Liste, jede Abfrage in der schlechtesten Zeit O (log n)?
SDCVVC

2
@Filip: Ist das leicht zu sehen? Wenn es wahr ist, bin ich damit einverstanden, dass es die Frage löst.
Tsuyoshi Ito

Antworten:


30

Hier ist ein Beweis, dass es unmöglich ist. Angenommen, Sie könnten eine solche Datenstruktur erstellen. Baue es. Wählen Sie dann zufällige Elemente aus der Liste aus, fügen Sie jedem , wobei kleiner als die Differenz zwischen zwei Elementen in der Liste ist, und führen Sie die Abfragen durch, um zu prüfen, ob eines der resultierenden Elemente vorhanden ist ist in der Liste. Sie haben bisher Abfragen durchgeführt.ϵ ϵ O ( n )n/lognϵϵO(n)

Ich möchte behaupten, dass die von Ihnen durchgeführten Vergleiche ausreichen, um festzustellen, ob ein Element in der ursprünglichen Liste kleiner oder größer als ein neues Element . Angenommen, Sie könnten es nicht sagen. Da es sich dann um ein vergleichsbasiertes Modell handelt, würden Sie nicht wissen, ob gleich oder nicht. Dies ist ein Widerspruch zu der Annahme, dass Ihre Datenstruktur funktioniert.b a babab

Da die von Ihnen ausgewählten Elemente zufällig waren, haben Ihre Vergleiche mit hoher Wahrscheinlichkeit genügend Informationen geliefert, um die ursprüngliche Liste in Listen der Größe . Indem Sie jede dieser Listen sortieren, erhalten Sie einen zufälligen -Zeit-Sortieralgorithmus, der ausschließlich auf Vergleichen basiert. Dies ist ein Widerspruch.n / log n O ( log n ) O ( n log log n )n/lognn/lognO(logn)O(nloglogn)


Ein paar Hinweise zum besseren Verständnis des Beweises (vorausgesetzt, ich verstehe ihn natürlich selbst richtig): Die Elemente sollten von den Elementen ausgefüllt werden, nachdem ihnen hinzugefügt wurde. Das Vergleichsmodell garantiert, dass Sie wissen, welcher der Fälle und gilt. Die Listen sind in aufsteigender Reihenfolge: Jedes Element in einer höheren Liste ist höher als jedes Element in einer niedrigeren Liste. Nach den ursprünglichen Abfragen haben Sie genügend Informationen , um die Listen um die Elemente zu erstellen, die Sie zufällig ausgewählt haben.ε a b ein b n / log nbϵababn/logn
Alex ten Brink

(Fortsetzung) Beachten Sie, dass Sie nicht einmal explizit in der Lage sein müssen, die Liste in der angegebenen Zeit zu erstellen, damit der Proof gespeichert werden kann.
Alex ten Brink

Ich verstehe diesen Beweis nicht ganz. Der letzte Widerspruch ist "Algorithmus, der nur auf Vergleichen basiert", aber in den ersten Schritten unseres Algorithmus haben wir jedem Element hinzugefügt (ferner "wobei kleiner ist als die Differenz zwischen zwei Elementen auf der Liste"). Warum ist es immer noch gerechtfertigt, dass unser Algorithmus nur dann auf einem Vergleich basiert, wenn wir davon ausgehen, dass unsere Artikel eine nicht diskrete Gesamtreihenfolge aufweisen? ϵϵϵ
Artem Kaznatcheev

5
@Artem: Ihr ursprünglicher Eingang besteht aus Elementen . Dann konstruieren Sie eine neue Menge ; Sie repräsentieren ein ursprüngliches als und ein modifiziertes als . Jetzt verwenden Sie den Black-Box-Algorithmus. der Algorithmus vergleicht Elemente von miteinander; Um solche Fragen zu beantworten, müssen Sie nur eine konstante Anzahl von Elementen von miteinander vergleichen. Daher sollte im Vergleichsmodell alles machbar sein, mit einem konstanten Overhead. X ' = X × { 0 , 1 } x X ( x , 0 ) X ' x + ( x , 1 ) X ' X ' XxXX=X×{0,1}xX(x,0)Xx+ϵ(x,1)XXX
Jukka Suomela

1
@Aryabhata: Das tut es. Was ist der -Algorithmus? O(log2n)
Peter Shor

24

Ich glaube, hier ist ein anderer Beweis, der die Unmöglichkeit einer -Abfragezeitstruktur mit O ( n ) -Vorbearbeitung beweist .O(logkn)O(n)

Angenommen, Sie führen in der Vorverarbeitung Vergleiche durch, die zu einer Teilreihenfolge führen.O(n)

Betrachten Sie nun die Größe des größten Antichains darin. Da diese Elemente nicht vergleichbar sind, für uns ein haben O ( log k n ) Abfrage - Algorithmus, müssen wir haben , dass A = O ( log k n ) .AO(logkn)A=O(logkn)

Nach dem Satz von Dilworth gibt es nun eine Aufteilung der Größe in Ketten.A

Jetzt können wir den Algorithmus ergänzen, um die Ketten in der Partition zu bestimmen. Wir können feststellen, ob zwei Elemente vergleichbar sind, indem wir einen gerichteten Vergleichsdiagramm erstellen und eine Erreichbarkeitsanalyse durchführen. Dies kann ohne zusätzliche Vergleiche durchgeführt werden. Nun zwingen Sie einfach jede mögliche Partition der Größe um festzustellen, ob es sich um eine Partition von Ketten handelt.A

Sobald wir die Ketten haben, können wir sie zusammenführen, um einen -Vergleichsalgorithmus zum Sortieren der gesamten Liste zu erhalten.O(nloglogn)


1
Das ist eine schöne Idee. Und wenn Sie zeigen könnten, dass die Kettenpartition dem Algorithmus bekannt sein muss, könnten Sie mit mergesort zeigen, dass nur zusätzliche O (n log log n) -Vergleiche erforderlich sind, um die gesamte Eingabe zu sortieren, anstatt Jensen zu verwenden. Es gibt jedoch ein Problem: Warum muss der Vorverarbeitungsalgorithmus eine Kettenpartition erstellen? Ja, es muss eine Kettenpartition geben, aber das ist etwas ganz anderes, als dem Algorithmus bekannt zu sein.
David Eppstein

8
O(nloglogn)

6
Ω(nlogn)Ω(n)

1
@Yuval: Vielleicht sollten Sie diese Beobachtung als eine tatsächliche Antwort aufschreiben, da ich der Meinung bin, dass Sie einen moderaten Arbeitsaufwand leisten müssen, um das obige Ergebnis aus den Beweisen in den Antworten zu erhalten.
Peter Shor

1
Ω(nlogn)Ω(n1ϵ)ϵo(nlogn)O(n/logn)lognn/lognθ(nloglogn)

0

k<nn c > 0 cΘ(nlogk)nc>0ccnlogkk ' = k / log k n / log n O ( ncnlogk/kk=k/logkn/lognO(nlogk)=O(nlogk)Zeit, die Abfragekosten ermöglicht.O(n/k)

Insbesondere bei Verwendung der -Vorbearbeitung können keine -Anfragekosten anfallen. Außerdem entspricht die Vorverarbeitung von in für jedes und damit Abfragekosten.o ( n ) o ( n log n ) k O ( n ε ) ε > 0 Ω ( n 1 - ε )O(n)o(n)o(nlogn)kO(nε)ε>0Ω(n1ε)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.