Haffman Code

什么是Haffman编码?以后再说,嘿嘿先上实现。

Python 实现:

在这个实现当中,我们并没有统计文本的字符出现频率,仅仅是为Haffman Coding的一个demo.

"""
Code writer : EOF
Code file   : haffman.py
Code date   : 2015.01.28
e-mail      : [email protected]

Code description:

    Here is a implementation of Haffman-Code
in Python.

"""

class node() :
    def __init__(self,num) :
        self.right = None
        self.left  = None
        self.key   = num

class haffman_tree():

    def __init__(self, array) :
        self.forest = []
        for i in range(0, len(array)) :
            self.forest += [node(array[i])]

        self.build()

    def small_tree(self) :
        smallest_tree = self.forest[0]
        location = 0
        for i in range(1, len(self.forest)) :
            if self.forest[i].key < smallest_tree.key :
                location = i
        return location

    def delete_root(self, x) :
        for i in range(0, len(self.forest)) :
            if x.key is self.forest[i].key :
               del self.forest[i]
               return

    def build(self) :
        while len(self.forest) is not 1 :
            small_tree_1 = self.forest[self.small_tree()]
	    self.delete_root(small_tree_1)
	    small_tree_2 = self.forest[self.small_tree()]
	    self.delete_root(small_tree_2)

	    tmp_node = node(small_tree_1.key + small_tree_2.key)
	    tmp_node.right = small_tree_1
	    tmp_node.left  = small_tree_2
	    self.forest += [tmp_node]
        self.root = self.forest[0]

        self.coding(self.root,'')

    def coding(self, node, path) :
        if node.right is None and node.left is None :
            print path, "is the haffman code of", node.key
            return
        else :
            self.coding(node.right, path + '1')
            self.coding(node.left,  path + '0')

#------------------------------------------------------

tree = haffman_tree(['a','b','c','d','e','f','g','h'])

在Haffman树(就是个二叉树)当中, 1代表右拐,0代表左拐。

后续会更新,把Haffman code 的原理和用处讲清楚。

时间: 2024-10-16 23:52:24

Haffman Code的相关文章

Haffman算法(C++)

Huffman编码,C++实现,只是为了说明大致的思路,还有很多不完美之处,比如在输入数据超出限制等条件下会出现错误. 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 #define MAX 20 5 6 /* 7 ** 用二叉树表示的Huffman节点 8 */ 9 typedef struct NodeTag { 10 char c; // 字母 11 int weight; // 频率 12 s

simhash与Google的网页去重

前几天去吃葫芦头的路上,大飞哥给详细的讲解了他在比较文本相似度实验时对Google的simhash方法高效的惊叹,回来特意去找了原文去拜读. Simhash 传统IR领域内文本相似度比较所采用的经典方法是文本相似度的向量夹角余弦,其主要思想是根据一个文章中出现词的词频构成一个向量,然后计算两篇文章对应向量的向量夹角.但由于有可能一个文章的特征向量词特别多导致整个向量维度很高,使得计算的代价太大,对于Google这种处理万亿级别的网页的搜索引擎而言是不可接受的,simhash算法的主要思想是降维,

【协议分析】HTTP2报文头及数据帧格式解析实例分析

一.HEAD HPACK压缩协议格式说明,HPACK压缩的二进制格式采用以下2种格式: 1.用索引标识头域,如下所示,0位固定为1,其它7bit标识索引值,索引参考下面的静态表格,如82代表 -> :method: GET. 0   1   2   3   4   5   6   7 +---+---+---+---+---+---+---+---+ | 1 |        Index (7+)         | +---+---------------------------+ Figur

哈夫曼算法(haffman)实现压缩和解压缩-C语言实现

/* * ===================================================================================== * * Filename: haffman.c * * Description: huffman coder decoder * * Version: 1.0 * Created: * Revision: none * Compiler: gcc * * * =============================

haffman哈夫曼编码的实现

<span style="font-size:18px;">/* 1.在一棵二叉树中,我们定义从A节点到B节点所经过的分支序列为从A节点到B节点的路径: 定义从A节点到B节点所经过的分支个数为从A节点到B节点的路径长度: 定义从二叉树的根节点到二叉树中所有叶节点的路径长度之和为该二叉树的路径长度. 2.如果二叉树中的叶节点都带有权值,则可以把这个定义推广.设二叉树有n歌带权值的叶节点,定义从二叉树的 根节点到二叉树中所有叶节点的路径长度与相应叶节点权值的乘积之和为该二叉树的

从微信官方获取微信公众号名片:http://open.weixin.qq.com/qr/code/?username=haihongruanjian

从微信官方获取微信公众号名片:http://open.weixin.qq.com/qr/code/?username=haihongruanjian 个人的号,不知道怎么获取.

微信 {&quot;errcode&quot;:40029,&quot;errmsg&quot;:&quot;invalid code, hints: [ req_id: Cf.y.a0389s108 ]&quot;}

{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"} 问题:微信网页授权后,获取到 openid 了,一刷新又没了 微信网页授权获取到的 code 只能使用一次(5分钟内有效),使用一次后,马上失效. 页面授权跳转成功,根据 code 也换取到 openid 了. 此时刷新页面,并不会再次进行授权,而是直接刷新了一下上一次授权跳转后的链接,带的还是

在linux系统中安装VSCode(Visual Studio Code)

1.从官网下载压缩包(话说下载下来解压就直接可以运行了咧,都不需要make) 访问Visual Studio Code官网 https://code.visualstudio.com/docs?dv=linux64 我是64位的: wget https://az764295.vo.msecnd.net/stable/7ba55c5860b152d999dda59393ca3ebeb1b5c85f/code-stable-code_1.7.2-1479766213_amd64.tar.gz 2.解

set up trace code tool

這以 GNU GLOBAL 6.5.6 為示範 1: install GNU GLOBAL https://www.gnu.org/software/global/download.html sudo ./configure; 若有以下 error,請看更下方的 Q5 說明. configure: checking "location of ncurses.h file"... configure: error: curses library is required but not f