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 ...
随机推荐
- guava的重试机制guava-retrying使用
1,添加maven依赖 <dependency> <groupId>com.github.rholder</groupId> <artifactId>g ...
- vue-样式问题
问题: 今天在用vue开发单页面应用的时候,遇到一个问题,在A页面,直接刷新,页面的布局样式之类的是没有问题的,不过在B页面跳转到A页面,那么A页面有一些样式就不是预期的效果. 发现解决问题: 用调试 ...
- node-sass 安装报错解决办法
npm install安装node-sass时出现以下问题: Cannot download https://github.com/sass/node-sass/releases/download/v ...
- Android Studio快捷键【Android学习入门】
Studio快捷键[Android学习入门]" title="Android Studio快捷键[Android学习入门]"> 提示 Ctrl+P方法参数提示 Ct ...
- 如何找到Android app启动activity和页面元素信息
在实施app自动化的时候,我们需要知道app 的启动activity和页面元素信息,以此启动app和定位页面元素,那么如何在没有源码的情况下找打他们呢?当然是有好的工具啦,有Android sdk自带 ...
- PAT1137
题意 一个学生的成绩由上机,期中,期末共3部分构成,现要求找出有资格获得证书的同学们. 证书获得者要求:上机分至少200,最终成绩及格. 最终成绩的生成规则:若期中分>期末分,则f = 期中 * ...
- python pip安装报错python setup.py egg_info failed with error code 1
安装locust遇到点问题折腾了好一会儿,记录一下. 使用命令pip install locustio提示python setup.py egg_info failed with error cod ...
- 关于tcp的keepalive
先记录几个要点 只能用在面向连接的tcp中,对应对端的非正常关闭有效(对端服务器重启这种,也是正常关闭,FIN RST包都算) 只要是写入到缓冲区就认为OK,所以UDP不适合,所以如果有正常的网络交互 ...
- CSS:响应式下的折叠菜单(条纹式)
原文:CSS: Responsive Navigation Menu 译文:CSS:响应式导航菜单 译者:dwqs 写在之前,关于如何制作响应式的下拉菜单:响应式下的下拉菜单 之前,我写了一篇关于怎么 ...
- 谷歌浏览器模拟手机浏览器且指定IP运行
1.背景 因为现在项目是要做分布式,而以前使用谷歌浏览器模拟手机运行做的分布式,是指定在某台机器运行是通过Jenkins配置,来指定服务器,但是这样有一个问题,如果大家都同时配置到某台电脑,那台服务器 ...