Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)

À propos de cet article

Dans cet article, je voudrais présenter un exemple d'implémentation en Python 3 sur l'algorithme que j'ai appris en lisant "Algorithm Picture Book". L'algorithme cette fois est le tri de tas. L'écrivain est un amateur. J'apprécierais que vous me disiez diverses choses.

Je ne suis pas familier avec Python2, mais je sais seulement que j'utilise Python3 (Est-ce Python3.6.0?). Par conséquent, le titre de l'article est Python3.

À propos du tri de tas

Je n'expliquerai que brièvement le problème et l'approche. Nous utilisons une structure de données appelée "tas". Pour plus de détails sur le tas, reportez-vous à "Algorithm Picture Book".

problème

Renvoie les colonnes triées par ordre croissant pour un nombre donné de colonnes.

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

approche

Stockez le nombre donné dans le tas décroissant (racine maximale), et répétez "Prendre la valeur de la racine-> mettre le plus à gauche". Pour plus de détails, reportez-vous à "Algorithm Picture Book".

Code d'implémentation et résultat d'exécution

Le code implémenté est illustré ci-dessous. Tout d'abord, je vais vous expliquer une petite idée.

De plus, j'ai osé l'implémenter pour étude, mais il semble que Python ait un module appelé heapq dans la bibliothèque standard, donc je pense qu'il est bon de l'utiliser pratiquement (https: //docs.python) .org / ja / 3 / bibliothèque / heapq.html).

Façon de penser

Une structure de données appelée tas est réalisée en prenant la signification dans l'ordre des éléments du tableau. Il sera plus facile à comprendre si vous regardez le supplément dans la section de tri de tas du "Livre d'images de l'algorithme".

De plus, dans le tas (tas de 2 minutes), il est pratique de démarrer le numéro d'élément à partir de 1, alors faites-le (tas de deux minutes Wikipedia #implementation of heap % 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))).

En gros, cela ressemble à ce qui suit.

code

La liste qui est initialement affectée aux données variables est la colonne numérique à traiter.

De plus, ce code peut être déroutant, je vais donc ajouter quelques fonctions à la version (?) Du code en bas pour une meilleure visibilité. Nous vous serions reconnaissants si vous pouviez nous donner votre avis sur lequel est le meilleur.

heap_sort.py


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

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

heap = [0] #Le 0ème élément est un mannequin(Il est facile de calculer si on compte à partir de 1 dans le tas)

#Stockez les données d'entrée dans le tas dans l'ordre(Reconstruisez le tas à chaque fois)
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:
                #Il a atteint la racine, donc je vais quitter ici
                break

#Récupérer les valeurs à la racine du tas(Reconstruisez le tas à chaque fois)
output_data = list() #Tableau pour la sortie

for i in range(0, data_len):
    #Copier la valeur racine
    output_data.insert(0, heap[1])

    #Supprimer les valeurs racine et reconstruire le tas
    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]
            #Il n'y a pas de branches au-delà de ça, donc ça sortira
            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))


Résultat d'exécution

python


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

À la fin

Si vous avez des questions, veuillez les signaler et poser des questions. Surtout s'il y a des améliorations dans la façon d'écrire le code, je pense que ce sera utile pour étudier.

En outre, j'apprécierais des conseils sur le test du code d'implémentation et la comparaison de la vitesse avec d'autres algorithmes. (Je ne l'ai pas encore testé (^^;)

Supplément

C'est la version (?) Du code ci-dessus qui a amélioré la visibilité en définissant certaines fonctions.

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] #Le 0ème élément est un mannequin(Il est facile de calculer si on compte à partir de 1 dans le tas)

#Stockez les données d'entrée dans le tas dans l'ordre(Reconstruisez le tas à chaque fois)
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:
                #Il a atteint la racine, donc je vais quitter ici
                break

#Récupérer les valeurs à la racine du tas(Reconstruisez le tas à chaque fois)
output_data = list() #Tableau pour la sortie

for i in range(0, data_len):
    #Copier la valeur racine
    output_data.insert(0, heap[1])

    #Supprimer les valeurs racine et reconstruire le tas
    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]
            #Il n'y a pas de branches au-delà de ça, donc ça sortira
            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

Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)
Implémentation de l'algorithme de "Algorithm Picture Book" en Python3 (Bubble Sort)
Implémentation de l'algorithme «Algorithm Picture Book» en Python3 (tri sélectif)
Algorithme de structure de données de livre d'images Python
Vérifiez le comportement du destroyer en Python
Livre Ali en python: méthode Dyxtra Sec.2-5
Le résultat de l'installation de python sur Anaconda
Principes de base pour exécuter NoxPlayer en Python
À la recherche du FizzBuzz le plus rapide en Python
Quel genre de livre est le "Python Crash Course" le plus vendu au monde?
Sortie du nombre de cœurs de processeur en Python
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Afficher le résultat du traitement de la géométrie en Python
Copiez la liste en Python
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Sortie sous la forme d'un tableau python
J'ai essayé d'implémenter la fonction gamma inverse en python
Implémentation de SimRank en Python
Algorithme génétique en python
Algorithme en Python (méthode Bellman-Ford, Bellman-Ford)
Implémentation de Shiritori en Python
Algorithme en Python (Dijkstra)
[Examen d'ingénieur d'information de base] J'ai écrit l'algorithme de la méthode de division mutuelle euclidienne en Python.
Découvrez la bonne efficacité de calcul de la vectorisation en Python
Trier en Python. Pensons ensuite à l'algorithme.
Informations de base Écrire le problème d'algorithme de l'automne 2018 en Python
[python] Récupère la liste des classes définies dans le module
L'histoire de FileNotFound en Python open () mode = 'w'
Implémenter la solution de l'algèbre de Riccati en Python
Obtenir la taille (nombre d'éléments) de Union Find en Python
Ne pas être conscient du contenu des données en python
Reproduire l'exemple d'exécution du chapitre 4 de Hajipata en Python
Utilisons les données ouvertes de "Mamebus" en Python
[Python] Affiche toutes les combinaisons d'éléments de la liste
Obtenez l'URL de la destination de la redirection HTTP en Python
Un mémorandum sur la mise en œuvre des recommandations en Python
Reproduire l'exemple d'exécution du chapitre 5 de Hajipata en Python
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Vérifiez la nature atrophique de la distribution de probabilité en Python
Vers la retraite de Python2
Trouver des erreurs en Python
Algorithme en Python (jugement premier)
Jugement d'équivalence d'objet en Python
Reproduire la méthode de division mutuelle euclidienne en Python
Algorithme en Python (dichotomie)
Implémentation de Supreme Solver dans Python 3
Implémenter l'algorithme de Dijkstra en python
Implémentation du tri rapide en Python
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
Essayez de gratter les données COVID-19 Tokyo avec Python
Découvrez la largeur apparente d'une chaîne en python