Huffman树与Huffman编码(C语言实现)
来源:互联网 发布:真两性畸形 知乎 编辑:程序博客网 时间:2024/05/23 02:02
1、Huffman树结构定义
#ifndef _huffman_tree_h#define _huffman_tree_htypedef struct huffman_tree_node{float weight;int lchild, rchild, parent;}huffman_tree_node, * huffman_tree;typedef struct huffman_code{char ch;char * code;}huffman_code;void create_huffman_tree( huffman_tree * root, float weight[], int n );void huffman_encode( huffman_tree root, huffman_code * codes );#endif
2、构造Huffman树
void create_huffman_tree( huffman_tree * root, float weight[], int n ){huffman_tree_node * p = NULL;int s1, s2;// indexint i, n_nodes = 0;if( n < 1 )return;n_nodes = 2 * n - 1;p = ( huffman_tree_node * )malloc( sizeof( huffman_tree_node ) * n_nodes );assert( p != NULL );for( i = 0; i < n_nodes; ++i ){p[i].weight = i < n ? weight[i] : 0;p[i].lchild = p[i].rchild = p[i].parent = NULL;}for( i = n; i < n_nodes; ++i ){sel_2_min( *root, weight, i - 1, &s1, &s2 );p[s1].parent = p[s2].parent = i;p[i].lchild = s1;p[i].rchild = s2;p[i].weight = p[s1].weight + p[s2].weight;}*root = p;}
其中函数sel_2_min的功能为选出数组w中最小的父指针为空的两个元素所在索引,比较高效的求解方案是用最小堆。
3、Huffman编码
typedef struct huffman_code{char ch;char * code;}huffman_code;
从每个叶节点上溯,得到编码的0-1序列
// 计算每个叶节点的编码,约定左分支编码为'0',右分支编码为'1'void huffman_encode( huffman_tree root, huffman_code hcode[], int n ){int i, j = 0, k, id_par;huffman_tree_node * p = root;char * code = ( char * )malloc( sizeof( char ) * n ); memset( code, '\0', sizeof( char) * n );hcode = ( huffman_code * )malloc( sizeof( huffman_code ) * n );assert( hcode != NULL );for( i = 0; i < n; ++i ){hcode[i].code = ( char * )malloc( sizeof( char ) * n );memset( hcode[i].code, 0, sizeof( char ) * n );hcode[i].ch = root[i].weight;}for( i = 0; i < n; ++i ){k = n - 1;code[k] = '\0';j = i;while( p[j].parent != 0 ){id_par = p[j].parent;code[--k] = p[id_par].lchild == j ? '0' : '1';j = id_par;}strcpy( hcode[i].code, &code[k] );}}
- Huffman树与Huffman编码(C语言实现)
- Huffman树与Huffman编码
- Huffman树与Huffman编码
- Huffman树与Huffman编码
- Huffman树与Huffman编码
- Huffman树与Huffman编码
- Huffman编码(Huffman树)
- Huffman编码C实现
- Huffman编码的c语言实现
- Huffman编码的C语言实现
- Huffman编码与解码_C语言实现
- Huffman树&&Huffman编码
- huffman树与编码
- huffman编码解码与huffman树
- Huffman编码原理(C++,java实现)
- Huffman树实现与应用(编码解码压缩解压缩)
- PTA-Huffman Codes 哈夫曼编码 C语言实现
- huffman树和huffman编码
- 从平衡树到oracle b-tree索引的原理探索
- 怎样抽取网页标记之间的正文
- HTML5 - Form validation
- openstack nova 基础知识——wsgi
- Junit4笔记-马士兵
- Huffman树与Huffman编码(C语言实现)
- C++发展过程中的杰出人物
- 浅谈游戏中动静态光照的运用
- UDK光照教程
- Lightmass静态全局光照
- Source引擎 光能传递和凹凸贴图的革命性结合
- 预渲染技术
- 光照贴图(Lightmapping)与辐照度(Radiosity)
- 匈牙利命名法