Comment puis-je créer un arbre de Huffman codage et de décodage?
Pour ma mission, je dois faire un encodage et de décodage pour arbres de huffman. J'ai un problème de la création de mon arbre, et je suis coincé.
N'avez pas l'esprit de l'impression des états - ils sont juste pour me tester et voir ce que la sortie est alors que ma fonction s'exécute.
Pour la première boucle for, j'ai eu toutes les valeurs et index dans le fichier texte que j'ai utilisé dans mon bloc principal pour les tests.
Dans la deuxième boucle for, j'ai inséré tous les trucs dans la file d'attente de priorité.
Je suis donc coincé sur où aller - je suis en train de faire des nœuds, mais je suis confus sur la façon de progresser. Quelqu'un peut-il me dire si je suis en train de faire de ce droit?
def _create_code(self, frequencies):
'''(HuffmanCoder, sequence(int)) -> NoneType
iterate over index into the sequence keeping it 256 elements long, '''
#fix docstring
p = PriorityQueue()
print frequencies
index = 0
for value in frequencies:
if value != 0:
print value #priority
print index #elm
print '-----------'
index = index + 1
for i in range(len(frequencies)):
if frequencies[i] != 0:
p.insert(i, frequencies[i])
print i,frequencies[i]
if p.is_empty():
a = p.get_min()
b = p.get_min()
n1 = self.HuffmanNode(None, None, a)
n2 = self.HuffmanNode(None, None, b)
print a, b, n1, n2
while not p.is_empty():
p.get_min()
J'ai inséré manuellement les deux premiers pour commencer mon arbre, est-ce correct?
Comment dois-je continuer? Je sais que l'idée de celui-ci, juste au niveau du code, je suis très coincé.
C'est à l'aide de python, par la manière. J'ai essayé de regarder sur Wikipedia, je connais les étapes, j'ai juste besoin d'aide sur le code et comment je dois continuer, merci!
La HuffmanNode vient de cette classe imbriquée:
class HuffmanNode(object):
def __init__(self, left=None, right=None, root=None):
self.left = left
self.right = right
self.root = root
comment alors ?la récursivité est donc source de confusion pour moi, peut-u sorta de me guider dans le ventre?
En fait, je pense qu'une solution itérative est assez simple. Voici deux de ces algorithmes donnés sur la wikipedia article le Codage Huffman.
OriginalL'auteur xevaaa | 2012-07-20
Vous devez vous connecter pour publier un commentaire.
L'algorithme de Huffman dans Wikipedia vous dit exactement comment créer un nœud de l'arbre, de sorte que votre programme peut être basé sur l'algorithme, ou une autre comme elle. Voici un programme en Python avec des commentaires montrant le correspondant de wikipédia étape de l'algorithme. Les données de test des fréquences des lettres de l'alphabet dans un texte en anglais.
Une fois que le nœud de l'arbre est créé, vous avez besoin de marcher vers le bas pour attribuer des codes de Huffman pour chaque symbole dans votre jeu de données. Puisque c'est les devoirs, c'est à vous, mais un algorithme récursif est la plus simple et la plus naturelle façon de le gérer. C'est seulement six lignes de code.
Lorsqu'il est exécuté sur l'alphabet de données, le Huffman codes sont:
J'ai tester votre code, mais j'ai une erreur:print(i[1], '{:6.2 f}'.format(i[0]), le code[i[1]]) KeyError: 'e'
Cela ne prend pas en compte le vocabulaire de la commande de nœuds avec l'égalité des fréquences.
OriginalL'auteur Dave
@Dave walk_tree est manquant arbre de code de traitement de
OriginalL'auteur user1762278
Encore une solution de retour d'un dictionnaire
{label:code}
et récursive dictionnairetree
contenant le graphe obtenu. L'entréevals
est en forme de dictionnaire{label:freq}
:Il peut être utilisé comme:
L'on peut visualiser l'arbre avec Graphviz:
La figure a été généré par le script suivant que (Graphviz est nécessaire):
OriginalL'auteur Pavel Prochazka
Je travaillais ce problème aujourd'hui, pour essayer et le résultat d'un match au-dessus de réponse. Pour la plupart partie, cette solution fonctionne bien mais la seule chose que je trouve non-intuitif est à ajouter [0] et [1] dans l'impression de la non-node (leaf).
Mais cela répond à des miracles sur la question -, vous pouvez l'imprimer à l'aide de toute la traversée de mécanisme
OriginalL'auteur max_new
@Dave classe HuffmanNode(objet) a un bug subtil. Lorsque les deux fréquences sont égales, une exception est levée: Pour exemple, nous allons
Puis vous obtenez des TypeError: unorderable types: HuffmanNode() < str().
Le problème a à voir avec la PriorityQueue mise en œuvre. Je soupçonne quand les premiers éléments de l'tuples de comparer l'égalité, PriorityQueue veut comparer le deuxième éléments dont l'un est un objet python. Vous ajoutez le lt méthode à votre classe et le problème est résolu.
OriginalL'auteur B Abali