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 ...
随机推荐
- 网站架构:消息队列 Java后端架构
2017-01-13 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间 ...
- XHTML教会我的一些东西-2
不知道写些什么,每次看完视频之后都按照里面的方法把相应的代码写了一遍.感觉问题不大,可能是我没去写那些复杂的代码,没有去思考其他一些新颖的架构. 在自己写代码和看视频的过程中,我明白了,一定要注意每一 ...
- CSS之background-image:在一个元素中设置给定数量的背景图片
众所周知,可以通过设置background-repeat的值来改变背景图片的重复次数.但有一个问题,background-repeat的值不是让图片只有1个,就是让图片铺满.如果只想设置给定数量的图片 ...
- hibernate 初印象
将要学习的内容: 1.HelloWorld a) xml b) annotation2.Hibernate 原理模拟 - 什么是 O/R Mapping 以及为什么要有 O/RMapping3.常见 ...
- 显示C++ vector中的数据
C++ 中的vector是一个容器数据类型,不能使用cout直接显示容器中的值. 以下程序中,myvector 是一个vector数据类型.将myvector替换为需要输出的vector. for(i ...
- 使用g++ 编译C++程序
在命令行下,编译C++程序 g++ main.cpp -o main.exe
- 腾讯云“动态加速”与“CDN”的区别——浅谈对“动态加速”的理解(可能有误)
CDN的劣势及“动态加速”产生背景 通常CDN对静态内容支持较好,若使用其加速动态内容,可能会导致异常(如导致无法登录).当然,可以将动态内容的在CDN节点上的缓存时间设置为0秒来解决.但这毕竟是用户 ...
- Codeforces - Educational Codeforces Round 5 - E. Sum of Remainder
题目链接:http://codeforces.com/contest/616/problem/E 题目大意:给定整数n,m(1≤n,m≤1013), 求(n mod 1 + n mod 2 + ... ...
- IOS 读取xib里的子控件
interface ViewController () /**获取.plist数据*/ @property (nonatomic,strong) NSArray *aps; @end @impleme ...
- 【转】你是不是也被Android Private Libraries、Referenced Libraries、android Dependency搞晕了~~
一.v4.v7.v13的作用和用法 1.Android Support V4, V7, V13是什么? 本质上就是三个java library. 2.为什么要有support库? 是为了解决软件的 ...