[PYTHON] [Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant l'arbre de dichotomie

[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant l'arbre de dichotomie

Objectif

Contenu

Définition de l'arbre dichotomisé

Un arbre de dichotomie est une structure de données de dichotomie qui contient les valeurs des nœuds pour lesquels une relation ordinale est définie (comme des valeurs numériques ou des caractères avec des séquences définies).   [Voir ici] pour l'arborescence (https://qiita.com/tagtagtag/items/c5c460633e1ac864937a).

Chaque nœud a 0, 1 et 2 nœuds enfants, et celui avec une valeur plus petite est défini comme un nœud enfant gauche et celui avec une valeur plus grande est défini comme un nœud enfant droit.

Dans la mesure où j'ai enquêté, je n'ai pas pu confirmer la définition exacte des nœuds avec la même valeur, je vais donc les inclure dans le bon nœud enfant dans cet article.

Veuillez noter qu'il existe une méthode pour supprimer les doublons dans certains cas.

Propriétés de l'arborescence de recherche de bisection

En raison de la définition ci-dessus, les valeurs plus petites que le nœud de sommet sont stockées dans la branche gauche, et les valeurs plus grandes que le nœud de sommet sont stockées dans la branche droite. Cette structure est conservée quelle que soit la position de l'arbre de dichotomie.

De plus, l'extrémité gauche de l'arborescence a la valeur minimale de l'ensemble et l'extrémité droite a la valeur maximale.

De plus, lorsque la valeur du nœud est sortie par traversée d'inodeur, l'ensemble est trié par ordre croissant et sorti.

二分探索木 Voir l'arbre de recherche de bisection du wiki

la mise en oeuvre

Une classe Node a été définie pour implémenter la structure de données de l'arbre de dichotomie.

La classe Node a les valeurs de «self.data» et l'enfant de gauche «self.left» enfant de droite «self.right» comme valeurs du nœud. Les enfants gauche et droit par défaut sont «Aucun».

Une classe BST a été définie pour l'implémentation de l'arbre de dichotomie.

Dans le constructeur, j'ai défini «self.root» et défini la valeur par défaut sur «Aucun». De plus, self.insert (val) est exécuté pour ajouter un nouveau nœud. L'introduction de la méthode est illustrée ci-dessous.

Implémenté ce qui suit comme méthode Voir le code pour plus de détails.

J'ai trouvé les points suivants intéressants dans cette structure de données.


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 
                        #Définissez False pour terminer pendant
                    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) 
           #Si vous souhaitez renvoyer la valeur atteinte par récursive, écrivez une fonction récursive après retour. Veuillez noter que l'utilisation est différente de celle de la traversée.
        
    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)

Courir

Exécuté comme suit

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('Trié lors de la sortie dans l'ordre de passage')
ins.inoder_traverse(ins.root)

résultat

La liste qui est insérée change à chaque fois, donc si vous l'essayez plusieurs fois, vous obtiendrez une meilleure compréhension.

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
--------------------------
Trié lors de la sortie dans l'ordre de passage
2
5
7
10
12
21
35
39
48
58
61
87

Les références

Recommended Posts

[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant l'arbre de dichotomie
[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant pour comprendre la dichotomie
Django super introduction par les débutants Python! Partie 6 J'ai essayé d'implémenter la fonction de connexion
J'ai essayé d'analyser la carte du Nouvel An par moi-même en utilisant python
J'ai essayé d'optimiser le séchage du linge
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
J'ai essayé d'implémenter PCANet
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé d'implémenter la détection d'anomalies par apprentissage de structure clairsemée
[Introduction à la simulation] J'ai essayé de jouer en simulant une infection corona ♬
[Django] J'ai essayé d'implémenter des restrictions d'accès par héritage de classe.
[Introduction à Pandas] J'ai essayé d'augmenter les données d'échange par interpolation de données ♬
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé d'implémenter Deep VQE
J'ai essayé de rendre possible l'envoi automatique d'un e-mail en double-cliquant simplement sur l'icône [Python]
[Introduction à la simulation] J'ai essayé de jouer en simulant une infection corona ♬ Partie 2
J'ai essayé de visualiser l'ensemble de données de préférence de boisson par décomposition tenseur.
J'ai essayé de mettre en place une validation contradictoire
J'ai essayé d'implémenter la classification des phrases par Self Attention avec PyTorch
J'ai essayé de résumer les commandes utilisées par les ingénieurs débutants aujourd'hui
J'ai fait apprendre à RNN la vague de péché et j'ai essayé de prédire
J'ai essayé de résoudre le problème de planification des équipes par diverses méthodes
J'ai essayé d'implémenter Realness GAN
Essayer d'implémenter et de comprendre les arborescences de segments étape par étape (python)
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
Django super introduction par les débutants Python! Partie 3 J'ai essayé d'utiliser la fonction d'héritage de fichier de modèle
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
J'ai essayé de rendre possible l'envoi automatique d'un e-mail en double-cliquant simplement sur l'icône [GAS / Python]
J'ai essayé de déplacer l'image vers le dossier spécifié en faisant un clic droit et un clic gauche
Lorsque j'ai essayé d'exécuter Python, j'ai été ignoré dans le Microsoft Store
J'ai essayé de résumer moi-même le flux général jusqu'à la création de services.
765 J'ai essayé d'identifier les trois familles professionnelles par CNN (avec Chainer 2.0.0)
J'ai essayé d'implémenter la régression linéaire bayésienne par échantillonnage de Gibbs en python
Touches de karaoké assorties ~ J'ai essayé de le mettre sur Laravel ~ <en route>
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé de comprendre l'arbre de décision (CART) pour classer soigneusement
J'ai essayé de résumer les commandes Linux utilisées par les ingénieurs débutants aujourd'hui - Partie 1-
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de résumer la commande umask
J'ai essayé d'implémenter la permutation en Python
J'ai essayé de reconnaître le mot de réveil
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai essayé d'implémenter PPO en Python
J'ai essayé d'implémenter CVAE avec PyTorch
Je souhaite lire le CSV ligne par ligne lors de la conversion du type de champ (tout en affichant la barre de progression) et le traiter.
Lorsque j'ai essayé de changer le mot de passe root avec ansible, je ne pouvais pas y accéder.
J'ai essayé de vérifier le théorème du Big Bang [Est-il sur le point de revenir?]
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.