Algorithmus, um den kleinsten Unterschied im Array zu finden


8

Wir wollen einen Algorithmus, der bei einem Array mit der Länge von ganzen Zahlen die minimale Differenz zwischen zwei ganzen Zahlen im Array findet.n

Ein solcher Algorithmus besteht darin, das Array zu sortieren und benachbarte Zahlenpaare zu überprüfen. Dies dauert einige Zeit .O(nlogn)

Gibt es einen schnelleren Weg, z. B. einen -Algorithmus?O(n)


ist nicht schneller als O ( n log n )O(n)O(nlogn)
David Merinos

Antworten:


7

Dies hängt von Ihrem Berechnungsmodell ab. Wenn Sie nur Arithmetik und Vergleiche zulassen (das algebraische Entscheidungsbaummodell), gibt es ein Untergrenze von ) für dieElementunterscheidbarkeit, das Problem der Entscheidung, ob alle Elemente verschieden sind. Ihr Problem ist natürlich noch schwieriger, daher gilt die gleiche Untergrenze.Ω(nlogn)

(Es gibt einige Kleingedruckte: Die Untergrenze gilt nur, wenn der Grad der zu vergleichenden Polynome begrenzt ist. Wenn Sie nur verschiedene Unterschiede , können Sie loslegen. Die algebraische Entscheidung Mit dem Baummodell können Sie auch allgemeinere Polynome in den Eingaben vergleichen, sofern sie einen begrenzten Grad haben.)xixj

Es gibt andere Modelle, die möglicherweise eine bessere Leistung erzielen. In einigen Modellen können Sie beispielsweise Ganzzahlen in sortieren . Aber ich kann mir vorstellen, dass Sie die Art von Tricks, die in solchen Algorithmen verwendet werden, nicht zulassen wollen.o(nlogn)


Vielen Dank. Was meinst du mit "Vergleich verschiedener Unterschiede "? Da es Θ ( n 2 ) solche Paare gibt, würde das nicht Ω ( n 2 ) dauern ? xixjΘ(n2)Ω(n2)
Boot

Nicht unbedingt. Vergleichsbasierte Algorithmen dürfen nur Elementpaare vergleichen. Hier erlaube ich Ihnen, kompliziertere Abfragen wie oder sogar x 1 + 5 x 8 - 17 x 3 < - 5 durchzuführen . Wir wissen, dass es eine Lösung gibt, die O ( n log n ) -Vergleiche vom Typ x i > x j und O ( n ) verwendet.x1x2>x3x4x1+5x817x3<5O(nlogn)xi>xjO(n)Vergleiche vom Typ . Die Frage ist, können Sie es besser machen, und die Antwort lautet Nein, wenn Sie sich nur auf lineare Abfragen (oder allgemeiner auf Abfragen mit begrenztem Grad) beschränken. xixj>xkx
Yuval Filmus

Ich bin mir nicht sicher, ob ich die praktische Bedeutung dieser Grenze für die Elementunterscheidbarkeit verstehe. Hätten Sie nicht ein erwartetes O (n) mit einer Hash-Tabelle?
JKFF

Eine Hash-Tabelle kann mit diesem Berechnungsmodell nicht implementiert werden. Im Allgemeinen sind Untergrenzen schwer zu beweisen. Das algebraische Entscheidungsbaummodell ist eines, bei dem nicht triviale Untergrenzen nachweisbar sind. Ich kann in keinem anderen Modell eine -Untergrenze nachweisen - tatsächlich sind solche Untergrenzen normalerweise nur für Zufallsfunktionen bekannt. Sie haben Recht, dass es einen Trick- o- Algorithmus ( n log n ) gibt, der über dieses Modell hinausgeht, aber mir fällt keiner ein. ω(n)o(nlogn)
Yuval Filmus

-1

Wenn Ganzzahlen im Array eine begrenzte Anzahl von Ziffern haben, können Sie ein Array mit dem Radix-Sortieralgorithmus sortieren , dh O (kN), und dann die benachbarten Zahlenpaare (O (N)) überprüfen. Die resultierende Komplexität ist O ((k + 1) N), linear.


1
Beachten Sie die Bedingungen, unter denen die Laufzeit der Radix-Sortierung tatsächlich gut ist.
Raphael

@ Raphael Nun, die ursprüngliche Frage war, ob der lineare Algorithmus existiert, also habe ich darüber nachgedacht. Sie meinen, dass k für kleines N größer als log (N) ist?
Pavel Davydov

kNΩ(nlogn)

@Raphael Ja, aber für ein Array von Ganzzahlen, die kleiner als 64 Bit sind (das ist ein ziemlich häufiger Fall), ist es linear. Ich werde meine Antwort bearbeiten. Danke für deine Kommentare.
Pavel Davydov
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.