[PYTHON] [Einführung] Ich habe versucht, es selbst zu implementieren, während ich den Dichotomiebaum erklärte

[Einführung] Ich habe versucht, es selbst zu implementieren, während ich den Dichotomiebaum erklärte

Zweck

Inhalt

Definition des dichotomisierten Baumes

Ein Dichotomiebaum ist eine Dichotomiedatenstruktur, die die Werte von Knoten enthält, für die eine Ordnungsbeziehung definiert ist (z. B. numerische Werte oder Zeichen mit definierten Sequenzen).   [Siehe hier] für die Baumstruktur (https://qiita.com/tagtagtag/items/c5c460633e1ac864937a).

Jeder Knoten hat 0, 1 und 2 untergeordnete Knoten, und der mit einem kleineren Wert wird als linker untergeordneter Knoten und der mit einem größeren Wert als rechter untergeordneter Knoten definiert.

Soweit ich untersucht habe, konnte ich die genaue Definition von Knoten mit demselben Wert nicht bestätigen, daher werde ich sie in den richtigen untergeordneten Knoten in diesem Artikel aufnehmen.

Bitte beachten Sie, dass es in einigen Fällen eine Methode zum Entfernen von Duplikaten gibt.

Eigenschaften des Bisektionssuchbaums

Aufgrund der obigen Definition werden Werte, die kleiner als der Scheitelpunktknoten sind, im linken Zweig und Werte, die größer als der Scheitelpunktknoten sind, im rechten Zweig gespeichert. Diese Struktur bleibt unabhängig von der Position des Dichotomiebaums erhalten.

Außerdem hat das linke Ende des Baums den Minimalwert der Menge und das rechte Ende den Maximalwert.

Wenn der Wert des Knotens durch Inoder-Traversal ausgegeben wird, wird die Menge in aufsteigender Reihenfolge sortiert und ausgegeben.

二分探索木 Siehe Wiki Bisection Search Tree

Implementierung

Eine Knotenklasse wurde definiert, um die Datenstruktur des Dichotomiebaums zu implementieren.

Die Node-Klasse hat die Werte "self.data" und das linke Kind "self.left", das rechte Kind "self.right" als Werte des Knotens. Die standardmäßigen linken und rechten untergeordneten Elemente sind "Keine".

Für die Implementierung des Dichotomiebaums wurde eine BST-Klasse definiert.

Im Konstruktor habe ich "self.root" definiert und den Standardwert auf "None" gesetzt. Außerdem wird "self.insert (val)" ausgeführt, um einen neuen Knoten hinzuzufügen. Die Einführung der Methode ist unten dargestellt.

Folgendes wurde als Methode implementiert Einzelheiten finden Sie im Code.

Ich fand die folgenden Punkte in dieser Datenstruktur interessant.


class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None


class BST:
    def __init__(self, arr):
        self.root = None

        for val in arr:
            self.insert(val)
    
    def insert(self, val):
        if self.root is None:
            self.root = Node(val)

        else:
            node = self.root
            flag = True

            while flag:
                if node.data > val:
                    if node.left is None:
                        node.left = Node(val)
                        flag = False 
                        #Setzen Sie False, um während zu beenden
                    else:
                        node = node.left
                else:
                    if node.right is None:
                        node.right = Node(val)
                        flag = False
                    else:
                        node = node.right


    def find(self, node, val):
        if node is not None:
            if node.data == val:
                return True

            else:
                flag_left = self.find(node.left, val) 
                flag_right = self.find(node.right, val)
            
                if flag_left or flag_right:
                    return True

        return False

    def bst_min(self, node):
        if node.left is None:
            return node.data
        else:
           return self.bst_min(node.left) 
           #Wenn Sie den Wert zurückgeben möchten, der durch rekursiv erreicht wurde, schreiben Sie nach der Rückgabe eine rekursive Funktion. Bitte beachten Sie, dass sich die Verwendung von der von Traversal unterscheidet.
        
    def bst_max(self, node):
        if node.right is None:
            return node.data
        else:
            return self.bst_max(node.right)

    def inoder_traverse(self, node):
        if node is not None:
            self.inoder_traverse(node.left)
            print(node.data)
            self.inoder_traverse(node.right)

Lauf

Wird wie folgt ausgeführt

import random

arr = [random.randint(1, 100) for _ in range(12)]
ins = BST(arr)
print('insert node list =>', arr)
print('Is there No.4 ->', ins.find(ins.root, 4))
print('root', ins.root.data)
print('min', ins.bst_min(ins.root))
print('max', ins.bst_max(ins.root))
print('--------------------------')
print('Sortiert bei Ausgabe in der Reihenfolge der Übergabe')
ins.inoder_traverse(ins.root)

Ergebnis

Die Liste, die eingefügt wird, ändert sich jedes Mal. Wenn Sie es also einige Male versuchen, erhalten Sie ein besseres Verständnis.

insert node list => [48, 10, 21, 58, 61, 12, 5, 87, 35, 2, 7, 39]
Is there No.4 -> False
root 48
min 2
max 87
--------------------------
Sortiert bei Ausgabe in der Reihenfolge der Übergabe
2
5
7
10
12
21
35
39
48
58
61
87

Verweise

Recommended Posts

[Einführung] Ich habe versucht, es selbst zu implementieren, während ich den Dichotomiebaum erklärte
[Einführung] Ich habe versucht, es selbst zu implementieren, während ich erklärte, um die Dichotomie zu verstehen
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
Ich habe versucht, die Neujahrskarte selbst mit Python zu analysieren
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
Ich habe versucht, PCANet zu implementieren
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
[Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬
[Django] Ich habe versucht, Zugriffsbeschränkungen durch Klassenvererbung zu implementieren.
[Einführung in Pandas] Ich habe versucht, die Austauschdaten durch Dateninterpolation zu erhöhen ♬
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe versucht, Deep VQE zu implementieren
Ich habe versucht, das automatische Senden einer E-Mail durch Doppelklicken auf das Symbol [Python] zu ermöglichen
[Einführung in die Simulation] Ich habe versucht, durch Simulation einer Koronainfektion zu spielen ♬ Teil 2
Ich habe versucht, den Getränkepräferenzdatensatz durch Tensorzerlegung zu visualisieren.
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe versucht, die Satzklassifizierung durch Self Attention mit PyTorch zu implementieren
Ich habe versucht, die Befehle zusammenzufassen, die Anfängeringenieure heute verwenden
Ich ließ RNN Sin Wave lernen und versuchte vorherzusagen
Ich habe versucht, das Schichtplanungsproblem mit verschiedenen Methoden zu lösen
Ich habe versucht, Realness GAN zu implementieren
Der Versuch, Segmentbäume Schritt für Schritt zu implementieren und zu verstehen (Python)
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Ich habe versucht, das automatische Senden einer E-Mail durch Doppelklicken auf das Symbol [GAS / Python] zu ermöglichen
Ich habe versucht, das Bild durch Klicken mit der rechten und linken Maustaste in den angegebenen Ordner zu verschieben
Als ich versuchte, Python auszuführen, wurde ich zum Microsoft Store übersprungen
Ich habe versucht, den allgemeinen Ablauf bis zur Erstellung von Diensten selbst zusammenzufassen.
765 Ich habe versucht, die drei Berufsfamilien durch CNN zu identifizieren (mit Chainer 2.0.0).
Ich habe versucht, die Bayes'sche lineare Regression durch Gibbs-Sampling in Python zu implementieren
Passende Karaoke-Tasten ~ Ich habe versucht, es auf Laravel zu setzen ~ <auf dem Weg>
Ich habe versucht, die optimale Route des Traumlandes durch (Quanten-) Tempern zu finden
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, den entscheidenden Baum (CART) zu verstehen, um ihn sorgfältig zu klassifizieren
Ich habe versucht, die Linux-Befehle zusammenzufassen, die heute von Anfängeringenieuren verwendet werden - Teil 1-
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe versucht, Permutation in Python zu implementieren
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
Ich habe versucht, PPO in Python zu implementieren
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich möchte CSV Zeile für Zeile lesen, während ich den Feldtyp konvertiere (während der Fortschrittsbalken angezeigt wird) und ihn verarbeiten.
Als ich versuchte, das Root-Passwort mit ansible zu ändern, konnte ich nicht darauf zugreifen.
Ich habe versucht, den Urknall-Satz zu verifizieren [Kommt er zurück?]
Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.