Logarithmische vs doppelte logarithmische Zeitkomplexität

9

Gibt es in realen Anwendungen einen konkreten Vorteil bei der Verwendung von anstelle von O ( log ( n ) ) Algorithmen?Ö(Log(Log(n))Ö(Log(n))

Dies ist der Fall, wenn beispielsweise Van-Emde-Boas-Bäume anstelle herkömmlicherer binärer Suchbaumimplementierungen verwendet werden. Wenn wir zum Beispiel nehmen, übertrifft der doppelte logarithmische Algorithmus im besten Fall den logarithmischen um (ungefähr) den Faktor 5 . Und auch im Allgemeinen ist die Implementierung schwieriger und komplexer.n<1065

Was denkst du, da ich BST persönlich VEB-Bäumen vorziehe?

Man könnte leicht zeigen, dass:

n<106. LognLog(Log(n))<5.26146

Ghassen Hamrouni
quelle
Grundsätzlich sollten Sie die im Algorithmus enthaltenen Konstanten für einen kleineren Wert / eine kleinere Eingabegröße betrachten. Idealerweise möchten wir, dass sie klein sind.
Singhsumit
3
Beachten Sie, dass es seit VEB-Bäumen eine Reihe von Verbesserungen gegeben hat, die sich auf Datenstrukturen im RAM mit einer Such- / Einfüge- / Löschkomplexität von ohne Randomisierung (deterministisch) und O ( ) belaufenO(log log n)mit Randomisierung. SieheDeterministische Sortierung in O (nloglogn)Zeit und linearem Raum. von Han und O (O(log log n)O(n log log n)Erwartete Zeit und linearer Raum. O(log log n)von Han und Thorup.
AT
In der realen Welt ist ein Faktor von 5 ziemlich bedeutsam, und die Anzahl der Elemente kann oft 10 ^ 9 oder sogar 10 ^ 12 betragen.
RBarryYoung

Antworten:

10

Vergessen Sie nicht, dass immer noch exponentiell (in log ( n ) ) schneller wächst als log ( log n ) !LognLog(n)Log(Logn)

Wenn Sie sich den Quotienten aus und log ( log ( n ) ) ansehen, ist in der Tat nicht viel Beeindruckendes zu sehen:Log(n)Log(Log(n))

log (n) / log (log (n))
[ Quelle ]

Trotzdem erhalten Sie einen Faktor fünf bis sechs für Größen bis zu . Beachten Sie, dass größere Größen in der Praxis keine Seltenheit sind und eine Beschleunigung um diesen Faktor fantastisch ist ! Es kann den Unterschied zwischen Ergebnissen nach dem Mittagessen oder erst morgen ausmachen. Beachten Sie, dass ein Teil der Beschleunigung möglicherweise von höheren Konstanten der Baumimplementierung verschlungen wird. Sie müssten c log ( n ) und d log ( log ( n ) ) mit c , d der tatsächlichen Laufzeitkonstanten zeichnen (oder analysieren) , um ein reales Bild zu erhalten.100000cLog(n)dLog(Log(n))c,d

Darüber hinaus ist das, was Dave erwähnt, wichtig: Wenn die so beschleunigte Operation beispielsweise linear häufig ausgeführt wird, werden konstante Beschleunigungen zu linearen Beschleunigungen, dh Sie können die führende Konstante Ihres gesamten Algorithmus verringern! Wie ich oben sagte, ist das großartig. Schauen Sie sich an, was passiert, wenn Sie die Operation Mal ausführen :n

n * log (n) / (n * log (log (n)))
[ Quelle ]

Wenn das die Mühe nicht wert ist, weiß ich nicht was.

Raphael
quelle
6

Man könnte sich vorstellen, dass der Unterschied in der Komplexität wirklich nicht so wichtig ist und dass die tatsächliche Laufzeit wichtiger ist. Wenn sich der Algorithmus jedoch im Kern eines anderen Algorithmus befindet, kann dieser Unterschied wichtig sein.

Aus rein theoretischen Gründen spielt der Unterschied natürlich eine Rolle, insbesondere wenn der Algorithmus Teil eines anderen ist. Es kann den größeren Algorithmus in eine andere Komplexitätsklasse einordnen.

Dave Clarke
quelle
6

Ich habe den van Emde-Boas-Baum tatsächlich einmal selbst gemessen. Ich habe es mit einem AA-Baum, einer Hashmap und einem Bit-Array verglichen.

Die Tests führen sizeEinfügungen mit Zufallszahlen im Intervall durch [0, bound], sizesuchen dann, sizelöschen und sizesuchen dann erneut . Löschvorgänge werden auch für Zufallszahlen ausgeführt, sodass Sie zuerst herausfinden müssen, ob sie überhaupt in der Struktur enthalten sind.

Hier sind die Ergebnisse ( size= 2000000, bound= 10000000) in Sekunden:

AATreeLookup - O(n log n)
Inserting... 3.3652452
Searching... 5.2280724
Deleting...  7.3457427
Searching... 9.1462039
HashLookup - O(n) expected
Inserting... 0.3369505
Searching... 0.6223035
Deleting...  0.9062163
Searching... 1.1718223
VanEmdeBoasTree - O(n log log n)
Inserting... 0.7007531
Searching... 1.1775800
Deleting...  1.7257065
Searching... 2.2147703
ArrayLookup - O(n)
Inserting... 0.0681897
Searching... 0.1720300
Deleting...  0.2387776
Searching... 0.3413800

Wie Sie sehen können, sind van Emde-Boas-Bäume etwa doppelt so langsam wie Hash-Maps, zehnmal so langsam wie Bit-Arrays und fünfmal so schnell wie binäre Suchbäume.

Für die oben genannten Punkte ist natürlich ein Haftungsausschluss erforderlich: Die Tests sind künstlich, Sie können möglicherweise den Code verbessern oder eine andere Sprache mit einem Compiler verwenden, dessen Ausgabe schneller ist, und so weiter und so fort.

Dieser Haftungsausschluss ist der Grund für die Verwendung der asymptotischen Analyse beim Entwurf von Algorithmen: Da Sie keine Ahnung haben, wie die Konstanten lauten, und sich die Konstanten in Abhängigkeit von Umgebungsfaktoren ändern können, können wir am besten eine asymptotische Analyse durchführen.

LognLogLogn232Log232=32Log32=5

Alex ten Brink
quelle
Springen Sie vielleicht in R (oder ein gleichwertiges Element) und erstellen Sie einige hübsche Grafiken (wie es @Raphael getan hat).
Dave Clarke
1
LognLogLogn
@ DaveClarke: Danke für die Vorschläge. Leider bin ich ziemlich schlecht darin, hübsche Bilder zu produzieren - ich denke, meine Bearbeitung hat die Lesbarkeit meiner Ergebnisse verbessert.
Alex Ten Brink
Es gibt wahrscheinlich nicht genug Daten für ein richtiges Bild. Egal ... aber das Lernen, gute Bilder zu machen, ist eine praktische Fähigkeit.
Dave Clarke