[PYTHON] Hash-Kette wollte ich vermeiden (2)

Guten Abend. Vielen Dank für Ihre weitere Unterstützung. m (_ _) m

Fortsetzung der vorherigen Sitzung. Ich habe es reibungslos geschrieben Beilage zum Dump.

test.py


    def dump(self):
        #Ich bin Tisch[*]Weil es ein Zeiger auf eine Tabelle ist[i] 
        for i in range(self.capacity):
            # table[i]Der Schlüssel gespeichert in,value,Rufen Sie np
            p = self.table[i]
            # end=""Ist eine Beschreibung, die eine Verbindung zum nächsten Druck herstellt
            print(i,end="")
            while p is not None:
                #Zeigen Sie die folgende Beschreibung unmittelbar nach i oben an
                # p.key , p.Wert weiter anzeigen
                print(f"=>{p.key}({p.value})",end="")
                #Ersetzen Sie p und den nächsten Schlüssel durch np,value,Verbinden Sie sich mit np
                p = p.np
            #Neue Zeile
            print()

Wenn Sie ein Bild haben, das Daten mit einer Perlenkette speichert, die ich das letzte Mal geschrieben habe Ich denke, es ist leicht vorstellbar.

Bisher mit der Hash-Kette, Ich habe die Daten gespeichert. Nachdem wir es gespeichert haben, wollen wir den Ansatz der Suche nach darin enthaltenen Daten in Frage stellen. Grundsätzlich sucht es nach Daten, indem es sie dem Schlüssel in dem bereits gespeicherten Knoten zuordnet.

test.py


    def search(self,key):
        #Suchen Sie den Zeiger der Tabelle vom Schlüssel.
        Vhash = key % self.capacity
        p = self.table[Vhash]
        
        while p is not None:
            #Wenn der gespeicherte Schlüssel und der Eingabetaste übereinstimmen. ..
            if p.key == key:
                #Daten mit Druck anzeigen
                return print(f"searched value is {p.value}")
            p = p.np
        #Wenn es nichts gibt, auch wenn Sie bis zum Ende mit while nach den entsprechenden Daten suchen, scheitern Sie
        print("faile to search")

Wenn Sie danach suchen, indem Sie es dem vorbereiteten Array hinzufügen, Sie können auch unnötige Elemente löschen, oder? Lassen Sie uns herausfordern. Finden Sie im Grunde wie bei der Suche den entsprechenden Knoten nach Schlüssel. Ändern Sie danach den Verbindungspunkt von Knoten zu Knoten, um den Löschvorgang abzuschließen. Ja, wir werden das np innerhalb des Knotens bearbeiten.

test.py


    def remove(self,key):
        Vhash = key % self.capacity
        p  = self.table[Vhash]
        pp = None #Anfangswert Keine
        while p is not None:
            if p.key == key
                #Beschreibung beim Löschen der ersten Daten
                if pp is None:
                    self.table[Vhash] = self.table[Vhash].np
                #Bearbeiten Sie andere Verbindungspunkte als das erste Element
                else:
                    #pp wird später beschrieben, aber das Bild ist Node, bevor der Schlüssel entspricht.
                    #p ist der Knoten, dem der Schlüssel entspricht.
                    # pp.Durch Ersetzen von np des Knotens, dessen Schlüssel np entspricht
                    #Löschen Sie den entsprechenden Schlüsselknoten aus der Datenverbindung
                    pp.np = p.np
        #Wenn p am Anfang.key !=Wenn es sich um einen Schlüssel handelt, ersetzen Sie pp und buffer durch p
        pp = p            
        #Setzen Sie den Wert von p auf p, um mit while zum Spitzenknoten zu gelangen.Aktualisiert mit np
        p  = p.np

Ich habe nicht erklärt, was Hash ist? Nach meinem Verständnis können Sie durch die Bereitstellung eines Schlüssels auf einmal einen Zeiger auf das entsprechende Array erhalten. Sie können es finden, und dann können Sie den entsprechenden Wert durch lineare Suche finden. Es war eine interessante Suchmethode. Um dies zu erreichen, muss es natürlich gemäß dieser Regel gespeichert werden.

Die Artikel wurden bisher nach einer bestimmten Anordnung oder nach derselben Anordnung organisiert. Der Explorationsansatz war grundlegend.

Diesmal ist dies nicht der Fall. Überprüfen Sie die Speichermethode selbst Es war ein interessanter Algorithmus, der das Erkunden erleichterte. (`) Nein

Ich werde das ganze Bild setzen. Es gibt einen optimalen Plan Wenn Sie irgendwelche Probleme haben, lassen Sie es mich bitte wissen. M (_ _) m.

Chained_hash.py


class Node:
    def __init__(self,key,value,np):
        self.key = key
        self.value = value
        self.np = np

class ChainedHash:
    def __init__(self,capacity):
        self.capacity = capacity
        self.table = [None]*self.capacity
        
    def add(self,key,value):
        
        Vhash = key % self.capacity
        p = self.table[Vhash]
        
        while p is not None:
            if p.key == key:
                return False
            p = p.np
        
        temp = Node(key,value,self.table[Vhash])
        self.table[Vhash] = temp
    
    def dump(self):
        for i in range(self.capacity):
            p = self.table[i]
            print(i,end="")
            while p is not None:
                print(f"=>{p.key}({p.value})",end="")
                p = p.np
            print()
            
    def search(self,key):
        Vhash = key % self.capacity
        p = self.table[Vhash]
        
        while p is not None:
            if p.key == key:
                return print(f"searched value is {p.value}")
            p = p.np
        print("faile to search")
        
    def remove(self,key):
        Vhash = key % self.capacity
        p  = self.table[Vhash]
        pp = None
        while p is not None:
            if p.key == key:
                if pp is None:
                    self.table[Vhash] = self.table[Vhash].np
                else:
                    pp.np = p.np
        pp = p            
        p  = p.np

test = ChainedHash(7)

while True:
    num = int(input("select 1.add, 2.dump, 3.search, 4.remove : "))
    if num == 1:
        key = int(input("key: "))
        val = int(input("val: "))
        test.add(key,val)
    elif num == 2:
        test.dump()
    elif num == 3:
        key = int(input("key: "))
        test.search(key)
    elif num == 4:
        key = int(input("key: "))
        test.remove(key)
    else:
        break  

Recommended Posts

Hash-Kette wollte ich vermeiden (2)
Hash-Kette wollte ich vermeiden (1)
Ich wollte cGAN zu ACGAN weiterentwickeln
Ich wollte ABC160 mit Python lösen
Ich wollte ABC159 mit Python lösen
Ich wollte ABC172 mit Python lösen
Ich wollte unbedingt mit Selen kopieren
DQN mit TensorFlow implementiert (ich wollte ...)
Ich wollte den NOMURA Contest 2020 mit Python lösen
Ich wollte mit der Bezier-Kurve spielen
Ich wollte Python 3.4.3 mit Homebrew + pyenv installieren
Ich wollte nur Pythons Pickle-Modul verstehen
Ich wollte auch Typhinweise mit numpy überprüfen
Ich fing an zu analysieren
Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich habe versucht zu debuggen.
[Fehler] Ich wollte Sätze mit Flairs TextRegressor generieren
Eine Geschichte über den Wunsch, die Django-Administrationsseite ein wenig zu ändern
Ich wollte den Panasonic Programming Contest 2020 mit Python lösen
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
[Markov-Kette] Ich habe versucht, negative Emotionen in Python zu laden.
[Markov-Kette] Ich habe versucht, die Zitate in Python einzulesen.
Ich wollte bestimmte Erweiterungen beim Erstellen der Sphinx-Dokumentation überspringen
Ich wollte mich um die Ausführungszeit und die Speichernutzung kümmern
Ich habe das Toho-Projekt mit Deep Learning aufgenommen ... ich wollte.
Ich wollte ein Array mit der Subs-Methode von Sympy berechnen
Ich wollte mit boto3 mehrere objekte in s3 löschen
Ich habe versucht, PredNet zu lernen
Ich habe versucht, SVM zu organisieren.
Ich habe mit Raspberry Pi gesprochen
Ich habe versucht, PCANet zu implementieren
Einführung in die nichtlineare Optimierung (I)
Ich habe LightFM auf Movielens angewendet
Ich möchte SUDOKU lösen
Ich habe versucht, Linux wieder einzuführen
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, SparseMatrix zusammenzufassen
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
Ich wollte es so machen, als würde ich einen Testfall für AtCoder ausführen.
Ich wollte mein Gesichtsfoto in einen Yuyu-Stil umwandeln.
Ich wollte die Klassifizierung von CIFAR-10 mit dem Chainer-Trainer in Frage stellen
Ich wollte so etwas wie Elixirs Pipe in Python machen
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Was ich getan habe, als ich Python schneller machen wollte - Numba Edition -
[Django] Ich wollte testen, wenn ich eine große Datei poste [TDD]