Huffman Tree -- Huffman编码
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct HuffmanTree
{
int weight;
int parent, lchild, rchild;
}HuffmanTree;
typedef struct CodeNode
{
int ch;
char bits[4+1];
}CodeNode;
void SelectMin(HuffmanTree tree[], int len, int * pos1, int* pos2)
{
int min=255;
int i, j;
*pos1=0;
*pos2=0;
for(i=0; i<len; i++)
{
if(tree[i].parent==-1)
if(min>tree[i].weight)
{
min=tree[i].weight;
*pos1=i;
}
}
min=255;
for(j=0; j<len; j++)
{
if(j==*pos1)
continue;
if(tree[j].parent==-1)
if(min>tree[j].weight)
{
min=tree[j].weight;
*pos2=j;
}
}
}
void CreateHuffmanTree(HuffmanTree tree[], int n)
{
int m=2*n;
int i;
for(i=n; i<m-1; i++)
{
int pos1, pos2;
HuffmanTree node;
SelectMin(tree, i, &pos1, &pos2);
printf("pos1=%d,pos2=%d\n", pos1, pos2);
node.weight=tree[pos1].weight+tree[pos2].weight;
tree[pos1].parent=i;
tree[pos2].parent=i;
node.lchild=pos1;
node.rchild=pos2;
node.parent=-1;
tree[i]=node;
}
}
void HuffmanEncoding(HuffmanTree tree[])
{
int c, p, i;
int start;
char cd[4+1];
cd[4]='\0';
for(i=0; i<4; i++)
{
printf("\n");
printf("%d",tree[i].weight);
printf(":");
start=4;
c=i;
while((p=tree[c].parent)!=-1)
{
if(tree[p].lchild==c)
{
cd[--start]='0';
}
else
{
cd[--start]='1';
}
c=p;
}
printf(&cd[start]);
}
}
int main(int argc, char* argv[])
{
HuffmanTree tree[4*2];
int i, j;
for(i=0; i<4; i++)
{
tree[i].lchild=-1;
tree[i].rchild=-1;
tree[i].parent=-1;
}
printf("请输入哈夫曼树叶子结点的权值: \n");
for(i=0; i<4; i++) //读入叶子结点的权值
{
int weight;
scanf("%d",&weight);
tree[i].weight=weight;
}
CreateHuffmanTree(tree, 4);
for(j=0; j<2*4-1; j++)
{
printf("tree[%d]:weight=%d \n", j, tree[j].weight);
}
HuffmanEncoding(tree);
return 0;
}
Huffman Tree -- Huffman编码的更多相关文章
- Huffman coding & Huffman tree
Huffman coding & Huffman tree Huffman coding 哈夫曼编码 / 最优二元前缀码 Huffman tree 哈夫曼树 / 最优二叉树 https://w ...
- 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)
哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...
- 哈夫曼树(Huffman Tree)与哈夫曼编码
哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman coding)
- Huffman Tree
哈夫曼(Huffman)树又称最优二叉树.它是一种带权路径长度最短的树,应用非常广泛. 关于Huffman Tree会涉及到下面的一些概念: 1. 路径和路径长度路径是指在树中从一个结点到另一个结点所 ...
- 数据结构实习 problem O Huffman Tree
Huffman Tree 题目描述 对输入的英文大写字母进行统计概率 然后构建哈夫曼树,输出是按照概率降序排序输出Huffman编码. 输入 大写字母个数 n 第一个字母 第二个字母 第三个字母 .. ...
- 用优先队列构造Huffman Tree及判断是否为最优编码的应用
前言 我们知道,要构造Huffman Tree,每次都要从堆中弹出最小的两个权重的节点,然后把这两个权重的值相加存放到新的节点中,同时让这两个节点分别成为新节点的左右儿子,再把新节点插入到堆中.假设节 ...
- Huffman树进行编码和译码
//编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...
- Huffman树的编码译码
上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...
- 51nod1117(简单huffman tree)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1117 题意:中文题诶- 思路:简单huffman tree ...
随机推荐
- ACM-树重心的性质及动态维护
本文转自http://fanhq666.blog.163.com/blog/static/81943426201172472943638/ 求树重心的方法:(NlogN) http://www.cnb ...
- RequestMapping的使用
1.RequestMapping的作用就是 配置url 2.实现功能: 可以在不同的url访问同一个方法.
- JS的函数参数传递为值传递
function setAge(i) { alert(i);//24 i = 18; alert(i);//18,i的改变不会影响外面的age }; var age = 24; setAge(age) ...
- [持续更新] Linux基础的重要命令
命令总结:100个左右 mkdir 方法一 [root@localhost ~]# mkdir /test && ls -ld /test 方法二 [root@localhost ~] ...
- HTML头部元素实例
HTML head 元素 标签 描述 <head> 定义了文档的信息 <title> 定义了文档的标题 <base> 定义了页面链接标签的默认链接地址 <li ...
- 轻松完成excel读写操作- 基于POI的框架BingExcel的使用(1)
Bingexcel User Guide 使用maven进行项目开发目前项目的maven仓库是在github上,浏览地址为 https://github.com/bingyulei007/mvn-re ...
- tcpdump确认服务器连接的交换机信息
Displaying CDP info via tcpdump or snoop Cisco Discovery Protocol is a management protocol that Cisc ...
- c++为什么定义了析构函数的类的operator new[]传入的参数会多4字节?
问题: 在网上看人写了这么一段代码: class A { public: A() { std::cout<<"call A constructor"<< ...
- Ubuntu 如何将桌面上的Home中的文件夹除去
安装Ubuntu后, 由于无法用Terminal(终端)进入带中文的文件夹,会引起很多操作不便.很多朋友想到了将它们都改成中文,但是当再次开机重启使却会发现,原本光洁的桌面现在竟然出现了一堆文件夹?? ...
- 制作URL以GET方式提交的简单加密程序
首先我们用到的是 DESCryptoServiceProvider 类 对此微软给出的解释是 定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP) 版本的包装对象.无法继承此类. 接下 ...