Ali-Buch in Python: Selbstimplementierung der Prioritätswarteschlange

Ich habe versucht, die Praxis der Verwendung der Klasse so zu schreiben, wie ich es mir vorstellen kann, aber ist das wirklich O (log n)? (Die Geschichte, die Berechnungszeit richtig zu betrachten). Es sollte in aufsteigender Reihenfolge herauskommen.

Ich verwende hier und da Python-Standardlistenoperationen, daher ist es schade, dass es dort zu O (n) wird.


def heapsort_one_step(heaplist,child_pos):
    if child_pos == 0:
        return heaplist,0,-1
    child = heaplist[child_pos]
    parent_pos = (child_pos-1)//2
    parent = heaplist[parent_pos]
    if parent > child:
        heaplist[child_pos], heaplist[parent_pos] = parent,child
        return heaplist,parent_pos,1
    else:

        return heaplist,parent_pos,-1

def heapsort(heaplist):
    a = 1
    child_pos = len(heaplist)-1
    while a != -1:
        heaplist,child_pos,a = heapsort_one_step(heaplist,child_pos)
    return heaplist


def reconstruct_heap_one_step(heaplist,parent_pos):

    if len(heaplist) == 2:
        heaplist = [min(heaplist),max(heaplist)]
        return heaplist, parent_pos, -1
        
    if 2*parent_pos+2 > len(heaplist)-1:
        return heaplist, parent_pos,-1
    
    child1 = heaplist[2*parent_pos + 1]
    child2 = heaplist[2*parent_pos + 2]

    if child1 > child2:
        minchild = child2
        child_pos = 2*parent_pos + 2
    else:
        minchild = child1
        child_pos = 2*parent_pos + 1

    if heaplist[parent_pos] > minchild:
        heaplist[child_pos], heaplist[parent_pos] = heaplist[parent_pos],heaplist[child_pos]
        return heaplist, child_pos,1
    else:
        return heaplist,child_pos,-1

def reconstruct_heap(heaplist):
    a = 1
    parent_pos = 0
    while a != -1:
        heaplist, parent_pos, a = reconstruct_heap_one_step(heaplist,parent_pos)
    return heaplist
        

class Heapq:

    def __init__(self,data = []):
        self.data = data

    def push(self,x):
        self.data.append(x)
        self.data = heapsort(self.data)
        print(self.data)

    def top(self):
        return self.data[0]

        
    def pop(self):
        if len(self.data) !=0:
            popval= self.data[0]
            self.data[0] = self.data[-1]
            self.data = self.data[:-1]
            self.data = reconstruct_heap(self.data)
            return popval
        else:
            print("Queue is empty.")

        


queue = []
x = Heapq(queue)

import random

for i in range(10):
    x.push(random.randint(0,100))

print(x.data)


for i in range(10):
    print(x.pop())

Ich habe das Gefühl, dass es definitiv eine prägnantere Schreibweise gibt.

Nachtrag) Es scheint, dass die Standardvariable, die aus irgendeinem Grund in \ _ \ _ init \ _ \ __ eingefügt wurde, möglicherweise sehr gefährlich war (siehe Kommentar).

Mit Virtual Box + Ubuntu + Anaconda auf Python3.6 migriert.

Recommended Posts

Ali-Buch in Python: Selbstimplementierung der Prioritätswarteschlange
Ali Buch in Python: Sec. 2-5 Graph
Ali Buch in Python: Seite 42 Münzausgaben
Ali Buch in Python: Abschnitt 2-4, Datenstruktur
Ali Buch in Python: Sec.2-5 Dyxtra-Methode
Ali-Buch in Python: Seite 43 Abschnittsplanung
Ali Buch in Python: Sec. 2-5 Graph (Vorbereitung)
Ameisenbuch in Python: Seite 49 Zaunreparatur
Verarbeitung in Python beenden
Ali Buch in Python: Abschnitt 2-3, Dynamische Planung (DP)
Ameisenbuch in Python: Seite 47 Sarumans Armee (POJ 3069)
Stapel und Warteschlange in Python
Versuchen Sie, Ihre eigenen Objekte mit Prioritätswarteschlangen in Python zu sortieren
Ali Buch in Python: Seite 45 Das kleinste Problem in lexikalischer Reihenfolge (POJ3617)
Ich habe die Warteschlange in Python geschrieben
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
Warteschlangen- und Python-Implementierungsmodul "deque"
Ameisenbuch mit Python (Kapitel 3 Zwischenausgabe ~)
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
Metaanalyse in Python
Unittest in Python
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Epoche in Python
Zwietracht in Python
Python #stack Warteschlange
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
Löse "AtCoder Version! Arimoto (Anfänger)" mit Python!
LiNGAM in Python