web-dev-qa-db-de.com

Einfügung Sortieren mit binärer Suche

Bei der Implementierung von Insertion Sort kann eine binäre Suche verwendet werden, um die Position innerhalb der ersten i - 1 Elemente des Arrays zu bestimmen, in die das Element i eingefügt werden soll.

Wie würde sich dies auf die Anzahl der erforderlichen Vergleiche auswirken? Wie wirkt sich eine solche binäre Suche auf die asymptotische Laufzeit von Insertion Sort aus?

Ich bin mir ziemlich sicher, dass dies die Anzahl der Vergleiche verringern würde, aber ich weiß nicht genau, warum.

13
Derrek Whistle

Direkt aus Wikipedia:

Wenn die Kosten für Vergleiche die Kosten für Swaps übersteigen, wie dies der Fall ist zum Beispiel mit String-Schlüsseln, die als Referenz gespeichert sind, oder mit einem menschlichen. Interaktion (z. B. Auswählen eines Paares nebeneinander), Die binäre Einfügungssortierung kann dann zu einer besseren Leistung führen. Binary Einfügung sort verwendet eine binäre Suche, um das korrekte .__ zu ermitteln. Position zum Einfügen neuer Elemente und führt daher thereforelog2 (n) ⌉ .__ aus. Vergleiche im Worst-Case, das ist O (n log n)}. Der Algorithmus als Ganzes hat wegen der .__ immer noch eine Laufzeit von O(n2). Für jedes Einfügen ist eine Reihe von Swaps erforderlich.

Quelle:

http://en.wikipedia.org/wiki/Insertion_sort#Variants

Hier ist ein Beispiel:

http://jeffreystedfast.blogspot.com/2007/02/binary-insertion-sort.html

Ich bin mir ziemlich sicher, dass dies die Anzahl der Vergleiche verringern würde, aber ich bin nicht genau sicher, warum.

Nun, wenn Sie Einfügungssortierung und binäre Suche bereits kennen, ist das ziemlich einfach. Wenn Sie ein Stück in Einfügesort einfügen, müssen Sie es mit allen vorherigen Stücken vergleichen. Angenommen, Sie möchten diese [2] an die richtige Stelle verschieben, müssen Sie mit 7 Stücken vergleichen, bevor Sie die richtige Stelle finden. 

[1] [3] [3] [3] [4] [4] [5] -> [2] <- [11] [0] [50] [47]

Wenn Sie den Vergleich jedoch auf halbem Weg beginnen (wie bei einer binären Suche), vergleichen Sie nur 4 Teile! Sie können dies tun, weil Sie wissen, dass die linken Teile bereits in Ordnung sind (Sie können die binäre Suche nur durchführen, wenn Teile in Ordnung sind!). 

Stellen Sie sich vor, Sie hätten Tausende von Teilen (oder sogar Millionen), dies würde Ihnen viel Zeit sparen. Ich hoffe das hilft. | = ^)

Wenn Sie über eine gute Datenstruktur für eine effiziente binäre Suche verfügen, ist es unwahrscheinlich, dass die Einfügungszeit von O (log n) auftritt. Umgekehrt ist es unwahrscheinlich, dass eine gute Datenstruktur für das schnelle Einfügen an einer beliebigen Position die binäre Suche unterstützt.

Um die Leistung O (n log n) der besten Vergleichs-Suchvorgänge mit Einfügungssortierung zu erreichen, wären sowohl die binäre Suche nach O (log n) als auch die beliebige Einfügung von O (log n) erforderlich.

6

Angenommen, das Array ist sortiert (um eine binäre Suche durchzuführen), verringert es keine Vergleiche, da die innere Schleife unmittelbar nach dem ersten Vergleich endet (da das vorherige Element kleiner ist). Im Allgemeinen liegt die Anzahl der Vergleiche bei der Einfügungssortierung bei max. Der Anzahl der Inversionen plus der Arraygröße - 1. 

Da die Anzahl der Inversionen im sortierten Array 0 beträgt, ist die maximale Anzahl der Vergleiche im bereits sortierten Array N - 1.

1
WastedPandoo

Sortierung der binären Einfügung - Nehmen Sie dieses Array => {4, 5, 3, 2, 1}

Stellen Sie sich vor, wir befinden uns innerhalb der Hauptschleife beim dritten Element. Wenn Sie nun die binäre Suche verwenden, wissen Sie, wo Sie 3 einfügen müssen, d. H. Vor 4.

Die binäre Suche verwendet den Vergleich O(Logn), was eine Verbesserung darstellt, aber wir müssen immer noch 3 an der richtigen Stelle einfügen. Dafür müssen wir 3 mit 5 und dann mit 4 tauschen.

Da das Einfügen genauso lange dauert wie ohne binäre Suche, bleibt die Komplexität im ungünstigsten Fall immer noch O (n ^ 2). Ich hoffe das hilft.

1
Armaan Chugh