Huffman Encode 哈弗曼编码(python实现)

# coding: utf-8
#Tree-Node Type
class Node:
    def __init__(self,freq):
        self.left = None
        self.right = None
        self.father = None
        self.freq = freq
    def __repr__(self):  #change the string representation of instances,see cookbook  8.1
        return ‘Node({0.freq!r})‘.format(self)
    def isLeft(self):
        return self.father.left == self

#create nodes 创建叶子节点
def createNodes(freqs):
    return [Node(freq) for freq in freqs]

#create Huffman-Tree 创建Huffman树
def createHuffmanTree(nodes):
    queue = nodes[:]  #copy of the nodes
    while len(queue) > 1:
        queue.sort(key=lambda item:item.freq)  #sort the objects by certain attribute
        node_left = queue.pop(0)
        node_right = queue.pop(0)
        node_father = Node(node_left.freq + node_right.freq)
        node_father.left = node_left
        node_father.right = node_right
        node_left.father = node_father
        node_right.father = node_father
        queue.append(node_father)
    queue[0].father = None  #self.father = None,可省去
    return queue[0]   #root node

#Huffman编码
def huffmanEncoding(nodes,root):
    codes = [‘‘] * len(nodes)  #叶子节点数即为编码数
    for i in range(len(nodes)):
        node_tmp = nodes[i]
        while node_tmp != root:
            if node_tmp.isLeft():
                codes[i] = ‘0‘ + codes[i]
            else:
                codes[i] = ‘1‘ + codes[i]
            node_tmp = node_tmp.father
    return codes

if __name__ == ‘__main__‘:
    chars = [‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘]
    freqs = [10,4,2,5,3,4,2,6,4,4,3,7,9,6]
    chars_freqs = zip(chars,freqs)
    nodes = createNodes([item[1] for item in chars_freqs])
    root = createHuffmanTree(nodes)
    codes = huffmanEncoding(nodes,root)
    chars_codes = zip(chars_freqs,codes)
    chars_codes.sort(key=lambda item:item[0][1])  #sort the result by the freqs
    for item in chars_codes:
        print ‘Character:%s freq:%-2d   encoding: %s‘ % (item[0][0],item[0][1],item[1])

Character:C freq:2    encoding: 10100
Character:G freq:2    encoding: 10101
Character:E freq:3    encoding: 0000
Character:K freq:3    encoding: 0001
Character:B freq:4    encoding: 0100
Character:F freq:4    encoding: 0101
Character:I freq:4    encoding: 0110
Character:J freq:4    encoding: 0111
Character:D freq:5    encoding: 1011
Character:H freq:6    encoding: 1110
Character:N freq:6    encoding: 1111
Character:L freq:7    encoding: 001
Character:M freq:9    encoding: 100
Character:A freq:10   encoding: 110

注:

1)__repr__修改instance的string representation,方便调试,见python cookbook 8.1节

2)line22和line55 根据提供的key参数对列表进行排序

3)构建Node类,体会OO编程

4)其他实现:Rosettacode

5)Ipython notebook

时间: 2024-10-11 00:45:12

Huffman Encode 哈弗曼编码(python实现)的相关文章

04-3. Huffman Codes (PAT) - 哈弗曼编码问题

In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redundancy Codes", and hence printed his name in the history of computer science. As a professor who gives the final exam problem on Huffman codes, I am enco

数据结构之哈弗曼编码的(Huffman Coding)加密解密压缩

Huffman树又叫最优二叉树,它的特点是带权路径最短. Huffman树的一个重要应用是Huffman编码,Huffman编码是长度最短的前缀编码.即给定要传送的字符的权值,根据权值求出Huffman编码,它一定是前缀编码(指任意字符的编码都不是另一个字符编码的前缀),并且在传送过程由字符组成的文字时,编码长度最小. 因此Huffman编码可以对文字进行加密解密还有压缩.加密的工作就是将文字转换为编码,解密工作是将编码转换为文字,如何转换本文不做详解(严蔚敏的<数据结构>书中有代码).那么如

哈弗曼编码及译码

路径长度:从树的一个结点到另一个结点之间边的条数. 树的路径长度:从树根到每个叶子结点之间路径长度之和. 带权树的路径长度:每个叶子结点带有权值,树根到叶子结点的路径长度乘以该叶子结点的权值之和. 哈弗曼树:带权树的路径长度最小的树,又称作最小二叉树和最优二叉树. 哈夫曼树的构造过程: 1.      根据给定的n个带权的结点,构成含有n棵二叉树(每个结点是一棵树)的集合,该树的左右子树均为空. 2.      从含有n棵子树集合中找出两棵权值最小的树最为左右子树构成一个新的二叉树. 3.   

java实现哈弗曼编码

根据输入的各个叶节点的权值,构建一棵最优树,根据最小带全路径,确定由0,1组成的哈弗曼编码. 首先在一个封装类TNode中构建一棵树的元素,比如权值,左节点,右节点,同时在TNode类中构建了哈弗曼编码值,以及判断节点是否为叶子节点 package 霍夫曼编码; /** * * @author luckid * @version 2014_10_11 * */ /** * 定义Huffman编码的节点 */ public class TNode { /** * * @param weight *

利用哈弗曼编码进行压缩

// sZipDemo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "HuffmanTree.cpp" #include "sZip.h" #include <fstream> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char str1[100

【算法设计与分析】8、哈弗曼编码,贪心算法实现

写这个玩意,我也是深深地感觉到自己数据结构的薄弱,可笑的是我一直以为学的还可以,结果一个堆结构就干了我半个月,才懂个大概= =,我也是醉了 BinaryTree.h二叉树的实现 /** * 书本:<算法分析与设计> * 功能:这个头文件是为了实现二叉树 * 文件:BinaryTree.h * 时间:2014年12月15日18:35:51 * 作者:cutter_point */ // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |

数据结构&amp;&amp;哈弗曼树和哈弗曼编码

1.什么是哈夫曼树和哈弗曼编码 大家来看这样一道面试题(题目来自于<程序员面试宝典>).用二进制来编码字符串"abcdabaa",需要能够根据编码,解码回原来的字符串,最少需要多长的二进制字符串? A.12 B.14 C.18 D.24 解析:典型的哈弗曼编码问题:字符串"abcdabaa"有4个a.2个b.1个c.1个d.构造哈弗曼树如下图所示(图好丑).a编码0(1位),b编码10(2位),d编码111(3位).二进制字符串的总长度为1*4+2*2+

用哈弗曼编码实现文件压缩和解压

放假了把这个改一下,发现确实用单字节压缩的压缩率要高一些,暂时没去管为什么,不过放假静下心来写的话确实效率高很多. 新版详见:http://blog.csdn.net/tookkke/article/details/50575103 今天脑洞大开突然想写一下,明明都要考试了,唉,怎么就管不住这手啊  总之呢,就是根据每种编码的出现频率把等长的编码换成变长的,据说理论上压缩比率是比较高的,可是为什么经检验我这个大部分时候压缩出来的比源文件还大呢? 哈弗曼编码的时候要先做一颗字典树,查找的时候就按照

哈弗曼编码和译码.cpp

<span style="color:#6600cc;">#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{ char a;//记录对应字符 int weight;//权值 int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char * *HuffmanCode;//动态分配数组存储哈夫