Gibt es in realen Anwendungen einen konkreten Vorteil bei der Verwendung von anstelle von O ( log ( n ) ) Algorithmen?
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.
Was denkst du, da ich BST persönlich VEB-Bäumen vorziehe?
Man könnte leicht zeigen, dass:
algorithms
complexity-theory
binary-trees
algorithm-analysis
search-trees
Ghassen Hamrouni
quelle
quelle
Antworten:
Vergessen Sie nicht, dass immer noch exponentiell (in log ( n ) ) schneller wächst als log ( log n ) !Logn Log( 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 ) )
[ 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.100000 c ⋅ log( n ) d⋅ log( 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
[ Quelle ]
Wenn das die Mühe nicht wert ist, weiß ich nicht was.
quelle
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.
quelle
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
size
Einfügungen mit Zufallszahlen im Intervall durch[0, bound]
,size
suchen dann,size
löschen undsize
suchen 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: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.
quelle