J'ai une méthode qui construit un arbre Huffman qui est la suivante:
def buildTree(tuples) :
while len(tuples) > 1 :
leastTwo = Tuple(tuples[0:2]) # get the 2 to combine
theRest = tuples[2:] # all the others
combFreq = leastTwo[0][0] + leastTwo[1][0] #enter code here the branch points freq
tuples = theRest + [(combFreq,leastTwo)] # add branch point to the end
tuples.sort() # sort it into place
return tuples[0] # Return the single tree inside the list
mais pendant que je nourris la fonction avec le paramètre suivant:
[(1, 'b'), (1, 'd'), (1, 'g'), (2, 'c'), (2, 'f'), (3, 'a'), (5, 'e')]
Je reçois l'erreur comme
File "<stdin>", line 7, in buildTree
tuples.sort()
TypeError: '<' not supported between instances of 'Tuple' and 'str'
Lors du débogage, j'ai trouvé que l'erreur se trouvait dans tuples.sort()
.
L'erreur est générée car vous créez des nœuds internes sous la forme (priority, (node, node))
. Pour des priorités égales, Python essaie ensuite de comparer un symbole d'un nœud feuille (donc le deuxième élément d'un tuple de nœud (priority, symbol)
) Avec le tuple (node, node)
De un nœud intérieur:
>>> inner = (combFreq, leastTwo)
>>> inner
(2, ((1, 'b'), (1, 'd')))
>>> theRest[1]
(2, 'c')
>>> theRest[1] < inner
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'Tuple'
Pour construire un arbre de Huffman, si vous voulez trier votre tableau de nœuds, vous n'avez vraiment besoin de trier que la priorité, en ignorant le reste des tuples (symboles ou nœuds enfants):
tuples.sort(key=lambda t: t[0])
Avec cette correction, votre fonction buildTree()
produit un arbre:
>>> buildTree([(1, 'b'), (1, 'd'), (1, 'g'), (2, 'c'), (2, 'f'), (3, 'a'), (5, 'e')])
(15, ((6, ((3, 'a'), (3, ((1, 'g'), (2, 'c'))))), (9, ((4, ((2, 'f'), (2, ((1, 'b'), (1, 'd'))))), (5, 'e')))))
Personnellement, j'utiliserais plutôt une file d'attente prioritaire, en évitant de trier à chaque fois. Voir Comment implémenter des files d'attente prioritaires en Python?