Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)

Über diesen Artikel

In diesem Artikel möchte ich ein Beispiel für die Implementierung in Python 3 über den Algorithmus vorstellen, den ich durch Lesen von "Algorithm Picture Book" gelernt habe. Der Algorithmus ist diesmal die Heap-Sortierung. Der Schriftsteller ist ein Amateur. Ich würde mich freuen, wenn Sie mir verschiedene Dinge erzählen könnten.

Ich bin nicht mit Python2 vertraut, aber ich weiß nur, dass ich Python3 verwende (Ist es Python3.6.0?). Daher lautet der Titel des Artikels Python3.

Über das Sortieren von Heaps

Ich werde die Problemstellung und den Ansatz nur kurz erläutern. Wir verwenden eine Datenstruktur namens "Heap". Einzelheiten zum Heap finden Sie im "Algorithm Picture Book".

Problem

Gibt die Spalten in aufsteigender Reihenfolge für eine bestimmte Anzahl von Spalten zurück.

Beispiel: 5, 2, 7, 3, 6, 1, 4 → 1, 2, 3, 4, 5, 6, 7

Ansatz

Speichern Sie die angegebene Zahl im absteigenden Heap (maximale Wurzel) und wiederholen Sie "Wert von Wurzel nehmen → Ganz links platzieren". Weitere Informationen finden Sie im "Algorithm Picture Book".

Implementierungscode und Ausführungsergebnis

Der implementierte Code wird unten gezeigt. Zuerst werde ich eine kleine Idee erklären.

Außerdem habe ich es gewagt, es für das Studium zu implementieren, aber es scheint, dass Python ein Modul namens heapq in der Standardbibliothek hat, daher denke ich, dass es gut ist, es praktisch zu verwenden (https: //docs.python). .org / ja / 3 / library / heapq.html).

Denkweise

Eine als Heap bezeichnete Datenstruktur wird realisiert, indem die Bedeutung in der Reihenfolge der Elemente des Arrays angenommen wird. Es ist leichter zu verstehen, wenn Sie sich die Ergänzung im Abschnitt "Heap-Sortierung" des "Algorithm Picture Book" ansehen.

Außerdem ist es im Heap (2-Minuten-Heap) praktisch, die Elementnummer von 1 aus zu starten (Wikipedia Bi-Minuten-Heap # Implementierung des Heaps % 8C% E5% 88% 86% E3% 83% 92% E3% 83% BC% E3% 83% 97 #% E3% 83% 92% E3% 83% BC% E3% 83% 97% E3% 81% AE% E5% AE% 9F% E8% A3% 85))).

Grob gesagt sieht es wie folgt aus.

Code

Die Liste, die anfänglich den variablen Daten zugewiesen wird, ist die zu verarbeitende Zahlenspalte.

Außerdem kann dieser Code verwirrend sein, daher füge ich der (?) Version des Codes unten einige Funktionen hinzu, um die Sichtbarkeit zu verbessern. Wir würden uns freuen, wenn Sie uns Ihre Meinung dazu mitteilen könnten, welche besser ist.

heap_sort.py


data = [5, 2, 7, 3, 6, 1, 4]

print("input    :" + str(data))
data_len = len(data)

heap = [0] #Das 0. Element ist ein Dummy(Es ist einfach zu berechnen, ob von 1 im Heap gezählt wird)

#Speichern Sie die Eingabedaten der Reihe nach im Heap(Erstellen Sie den Heap jedes Mal neu)
for i in range(0, data_len):
    heap.append(data[i])
    if i > 0:
        child = i + 1
        parent = child // 2
        while(heap[parent] < heap[child]):
            heap[parent], heap[child] = heap[child], heap[parent]
            if parent > 1:
                child = parent
                parent = child // 2
            else:
                #Es hat die Wurzel erreicht, also werde ich hier verlassen
                break

#Ruft Werte aus dem Stammverzeichnis des Heaps ab(Erstellen Sie den Heap jedes Mal neu)
output_data = list() #Array für die Ausgabe

for i in range(0, data_len):
    #Stammwert kopieren
    output_data.insert(0, heap[1])

    #Entfernen Sie die Stammwerte und erstellen Sie den Heap neu
    heap[1] = heap[-1]
    heap.pop(-1)

    parent = 1
    while(len(heap) >= 2 * parent + 1):
        if len(heap) == 2 * parent + 1:
            if heap[parent] < heap[2 * parent]:
                heap[parent], heap[2 * parent] = heap[2 * parent], heap[parent]
            #Es gibt keine Zweige darüber hinaus, also wird es herauskommen
            break
        else:
            if heap[2 * parent] > heap[2 * parent + 1]:
                child = 2 * parent
            else:
                child = 2 * parent + 1
            if heap[parent] < heap[child]:
                heap[parent], heap[child] = heap[child], heap[parent]
                parent = child
            else:
                break

print("output   :" + str(output_data))


Ausführungsergebnis

python


$ python heap_sort.py 
input    :[5, 2, 7, 3, 6, 1, 4]
output   :[1, 2, 3, 4, 5, 6, 7]

Am Ende

Wenn Sie Fragen haben, weisen Sie bitte darauf hin und stellen Sie Fragen. Besonders wenn es Verbesserungen beim Schreiben des Codes gibt, denke ich, dass es für das Lernen nützlich sein wird.

Ich würde mich auch über Hinweise zum Testen des Implementierungscodes und zum Vergleichen der Geschwindigkeit mit anderen Algorithmen freuen. (Ich habe es noch nicht getestet (^^;)

Ergänzung

Dies ist die (?) Version des obigen Codes, die durch die Definition einiger Funktionen die Sichtbarkeit verbessert hat.

heap_sort_2.py


def parent_of(child):
    return child // 2

def left_child_of(parent):
    return 2 * parent

def right_child_of(parent):
    return 2 * parent + 1

def heap_size(heap):
    return len(heap[1:])

data = [5, 2, 7, 3, 6, 1, 4]
# data = [43, 1, -4, 91, 46, -609]

print("input    :" + str(data))
data_len = len(data)

heap = [0] #Das 0. Element ist ein Dummy(Es ist einfach zu berechnen, ob von 1 im Heap gezählt wird)

#Speichern Sie die Eingabedaten der Reihe nach im Heap(Erstellen Sie den Heap jedes Mal neu)
for i in range(0, data_len):
    heap.append(data[i])
    if i > 0:
        child = i + 1
        parent = parent_of(child)
        while(heap[parent] < heap[child]):
            heap[parent], heap[child] = heap[child], heap[parent]
            if parent > 1:
                child = parent
                parent = parent_of(child)
            else:
                #Es hat die Wurzel erreicht, also werde ich hier verlassen
                break

#Ruft Werte aus dem Stammverzeichnis des Heaps ab(Erstellen Sie den Heap jedes Mal neu)
output_data = list() #Array für die Ausgabe

for i in range(0, data_len):
    #Stammwert kopieren
    output_data.insert(0, heap[1])

    #Entfernen Sie die Stammwerte und erstellen Sie den Heap neu
    heap[1] = heap[-1]
    heap.pop(-1)

    parent = 1
    while(heap_size(heap) >= left_child_of(parent)):
        if heap_size(heap) == left_child_of(parent):
            child = left_child_of(parent)
            if heap[parent] < heap[child]:
                heap[parent], heap[child] = heap[child], heap[parent]
            #Es gibt keine Zweige darüber hinaus, also wird es herauskommen
            break
        else:
            if heap[left_child_of(parent)] > heap[right_child_of(parent)]:
                child = left_child_of(parent)
            else:
                child = right_child_of(parent)
            if heap[parent] < heap[child]:
                heap[parent], heap[child] = heap[child], heap[parent]
                parent = child
            else:
                break

print("output   :" + str(output_data))

Recommended Posts

Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Heap Sort Edition)
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Bubble Sort)
Implementierte den Algorithmus von "Algorithm Picture Book" in Python3 (Selective Sort)
Bilderbuch-Datenstrukturalgorithmus Python
Überprüfen Sie das Verhalten des Zerstörers in Python
Ali Buch in Python: Sec.2-5 Dyxtra-Methode
Das Ergebnis der Installation von Python auf Anaconda
Grundlagen zum Ausführen von NoxPlayer in Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Was für ein Buch ist der meistverkaufte "Python Crash Course" der Welt?
Geben Sie die Anzahl der CPU-Kerne in Python aus
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Holen Sie sich den Aufrufer einer Funktion in Python
Passen Sie die Verteilung jeder Gruppe in Python an
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Kopieren Sie die Liste in Python
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Die Geschichte des Lesens von HSPICE-Daten in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Ausgabe in Form eines Python-Arrays
Ich habe versucht, die inverse Gammafunktion in Python zu implementieren
SimRank in Python implementiert
Genetischer Algorithmus in Python
Algorithmus in Python (Bellman-Ford-Methode, Bellman-Ford)
Shiritori in Python implementiert
Algorithmus in Python (Dijkstra)
[Basic Information Engineer Examination] Ich habe den Algorithmus der euklidischen Methode der gegenseitigen Teilung in Python geschrieben.
Erleben Sie die gute Berechnungseffizienz der Vektorisierung in Python
In Python sortieren. Lassen Sie uns als nächstes über den Algorithmus nachdenken.
Grundlegende Informationen Schreiben Sie das Problem mit dem Herbst 2018-Algorithmus in Python
[Python] Ruft die Liste der im Modul definierten Klassen ab
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
Implementieren Sie die Lösung der Riccati-Algebra in Python
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
Den Inhalt der Daten in Python nicht kennen
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 4 von Hajipata in Python
Verwenden wir die offenen Daten von "Mamebus" in Python
[Python] Gibt alle Kombinationen von Elementen in der Liste aus
Rufen Sie die URL des HTTP-Umleitungsziels in Python ab
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Reproduzieren Sie das Ausführungsbeispiel von Kapitel 5 von Hajipata in Python
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Überprüfen Sie die atrophische Natur der Wahrscheinlichkeitsverteilung in Python
Auf dem Weg zum Ruhestand von Python2
Finde Fehler in Python
Algorithmus in Python (Haupturteil)
Objektäquivalenzbeurteilung in Python
Reproduzieren Sie die euklidische Methode der gegenseitigen Teilung in Python
Algorithmus in Python (Dichotomie)
Implementierte Supreme Solver in Python 3
Implementieren Sie den Dijkstra-Algorithmus in Python
Implementierung der schnellen Sortierung in Python
Über die Funktionen von Python
Die Kraft der Pandas: Python
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus