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 )
Ich denke wirklich, dass es keinen gibt. Ein Beweis dafür, dass es keinen gibt, ist auch willkommen.
ds.data-structures
sorting
Chi-Lan
quelle
quelle
Antworten:
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 ba b a b
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/logn n/logn O(logn) O(nloglogn)
quelle
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 ) .A O(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)
quelle
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) k O(nε) ε>0 Ω(n1−ε)
quelle