c语言-只出现C,A,S,T,B五种字符,它们出现的频率依次是2,4,2,3,3,试设计哈夫曼编码

问题描述

只出现C,A,S,T,B五种字符,它们出现的频率依次是2,4,2,3,3,试设计哈夫曼编码

已知某系统在通讯时,只出现C,A,S,T,B五种字符,它们出现的频率依次是2,4,2,3,3,试设计哈夫曼编码
求C语言代码,谢大神帮助

解决方案

这是答案,但代码需要自己编写

解决方案二:

可参考

http://wenku.baidu.com/link?url=I6i3SKAdz4-e56zOCBwzdRvXAv4ERrXA47b9-eVwKCQFexD2pT6AUIGTd3QE6jXqiF1argvacOgs4gAULx1MG0FtcNW_kj6_dk72dUmGr57

解决方案三:

#include
#define N 50 /*叶子结点数*/
#define M 2*N-1 /*树中结点总数*/
typedef struct
{
char data; /*结点值*/
double weight; /*权重*/
int parent; /*双亲结点

/
int lchild; /
左孩子结

点*/
int rchild; /*右孩子结

点*/
} HTNode;
typedef struct
{
char cd[N]; /*存放哈夫

曼码*/
int start;
} HCode;
void CreateHT(HTNode ht[],int n)
{
int i,k,lnode,rnode;
double min1,min2;
for (i=0;i<2*n-1;i++)

/*所有结点的相关域置初值-1*/
ht[i].parent=ht

[i].lchild=ht[i].rchild=-1;
for (i=n;i<2*n-1;i++)

/*构造哈夫曼树*/
{
min1=min2=32767;

/*lnode和rnode为最小权重的两个结点

位置*/
lnode=rnode=-1;
for (k=0;k<=i-1;k++)
if (ht

[k].parent==-1) /*只在尚未构造二叉树的结点

中查找*/
{
if (ht

[k].weight<min1)
{

min2=min1;rnode=lnode;

min1=ht[k].weight;lnode=k;
}
else if

(ht[k].weight<min2)
{

min2=ht[k].weight;rnode=k;
}
}
ht[i].weight=ht

[lnode].weight+ht[rnode].weight;
ht[i].lchild=lnode;ht

[i].rchild=rnode;
ht[lnode].parent=i;
ht[rnode].parent=i;
}
}
void CreateHCode(HTNode ht[],HCode hcd

[],int n)
{
int i,f,c;
HCode hc;
for (i=0;i<n;i++) /*根据哈夫

曼树求哈夫曼编码*/
{
hc.start=n;c=i;
f=ht[i].parent;
while (f!=-1) /*循序直到

树根结点*/
{
if (ht

[f].lchild==c) /*处理左孩子结点*/
hc.cd

[hc.start--]='0';
else

    /*处理右孩子结点*/
            hc.cd

[hc.start--]='1';
c=f;f=ht[f].parent;
}
hc.start++;

/*start指向哈夫曼编码最开始字符*/
hcd[i]=hc;
}
}
void DispHCode(HTNode ht[],HCode hcd[],int

n)
{
int i,k;
double sum=0,m=0;
int j;
printf("输出哈夫曼编码:n"); /*输出

哈夫曼编码*/
for (i=0;i<n;i++)
{
j=0;
printf(" %c:",ht

[i].data);
for (k=hcd[i].start;k<=n;k

++)
{
printf("%c",hcd

[i].cd[k]);
j++;
}
m+=ht[i].weight;
sum+=ht[i].weight*j;
printf("n");
}
}
int main()
{
int n=5,i; /*n表示初始

字符串的个数*/
char str[]={'C','A','S','T','B'};
double fnum[]={2,4,2,3,3};
HTNode ht[M];
HCode hcd[N];
for (i=0;i<n;i++)
{
ht[i].data=str[i];
ht[i].weight=fnum[i];
}
printf("n");
CreateHT(ht,n);
CreateHCode(ht,hcd,n);
DispHCode(ht,hcd,n);
printf("n");
return 0;
}
供参考。

时间: 2024-11-05 09:10:03

c语言-只出现C,A,S,T,B五种字符,它们出现的频率依次是2,4,2,3,3,试设计哈夫曼编码的相关文章

哈夫曼编码问题 语言-求大神更正一下哈夫曼编码,重谢!

问题描述 求大神更正一下哈夫曼编码,重谢! #include #include #include static float weights[]={12.702 ,9.056 ,8.167 ,7.507 ,6.966 ,6.749 ,6.327 , 6.094 ,5.987 ,4.253 ,4.025 ,2.782 ,2.758 ,2.406 , 2.360 ,2.228 ,2.105 ,1.974 ,1.929 ,1.492 ,0.978 , 0.722 ,0.153 ,0.150 ,0.095

哈夫曼算法构造代码_C 语言

1.定义 哈夫曼编码主要用于数据压缩. 哈夫曼编码是一种可变长编码.该编码将出现频率高的字符,使用短编码:将出现频率低的字符,使用长编码. 变长编码的主要问题是,必须实现非前缀编码,即在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀.如:0.10就是非前缀编码,而0.01不是非前缀编码. 2.哈夫曼树的构造 按照字符出现的频率,总是选择当前具有较小频率的两个节点,组合为一个新的节点,循环此过程知道只剩下一个节点为止. 对于5个字符A.B.C.D.E,频率分别用1.5.7.9.6表示,

解析C++哈夫曼树编码和译码的实现_C 语言

一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 二.实现步骤: 1.构造一棵哈夫曼树 2.根据创建好的哈夫曼树创建一张哈夫曼编码表 3.输入一串哈夫曼序列,输出原始字符 三.设计思想: 1.首先要构造一棵哈夫曼树,哈夫曼树的结点结构包括权值,双亲,左右孩子:假如由n个字符来构造一棵哈夫曼树,则共有结点2n-1个:在构造前,先初始化

c语言-C语言只使用2个变量实现交换两个int数字,方法越多越好,谢谢

问题描述 C语言只使用2个变量实现交换两个int数字,方法越多越好,谢谢 C语言只使用2个变量实现交换两个int数字,方法越多越好,谢谢 解决方案 int x = 1; int y = 2; x = x ^ y; y = x ^y; x = x ^ y; 解决方案二: int x=1; int y=2; x=x+y; y=x-y; x=x-y; 解决方案三: 我以为b=a+b-(a=b) 应该是结果为b = 原来的b 没有改变b. 但是我测试发现vs2010是这样的 没有改变的b, 但是gcc

c语言-数据结构C语言字符串的输出时总是少输出最后一个字符,这是怎么回事啊?

问题描述 数据结构C语言字符串的输出时总是少输出最后一个字符,这是怎么回事啊? 代码如下: #include #include struct SeqString { int MAXNUM;//字符串的最大个数 int n;//字符串的长度 char c;//存储基地址 }; typedef struct SeqString *PSeqString; PSeqString CreatNullStr(int m); void InitStr(PSeqString pstr); /***主函数****

Quip移动文字处理应用程序开始支持五种语言

摘要: 在推出后不到一个月的时间内,创业公司Quip的移动文字处理应用程序就已开始支持五种语言.Quip公司的成功经验告诉我们,美国应用程序开发者应抓住机会尽早走向国际舞台,否则为 在推出后不到一个月的时间内,创业公司Quip的移动文字处理应用程序就已开始支持五种语言.Quip公司的成功经验告诉我们,美国应用程序开发者应抓住机会尽早走向国际舞台,否则为时晚矣. 据美国科技博客ReadWrite报道, 谷歌 ( 微博 )和 苹果 应用商店让开发者有机会迅速接触到国际用户.但是,来自市场研究公司Fl

哈夫曼树(一) C语言详解

哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树.这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答. (01) 路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. 例子:100和80的路径长度是

c语言-关于科夫曼树的一个小问题

问题描述 关于科夫曼树的一个小问题 在看到最优二叉树的时候有关于树的路径有这个个定义:树的路径长度是从树根到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 这里我一直不理解,如下图,一个是完全二叉树,一个是普通的二叉树.可是他们的路径长度不是完全一样吗? 另外,还有一个问题,就是在生成科夫曼树的时候,假如在取2个最小权值的时候,发现此时有3数在范围内,即一个刚刚生成的权值和一个处在森林里的只有根结点的权值相等,同为次小的数.此时应如何取舍,为什么? 解决方案 最

c语言:如何把一个整数按位保存在一个字符数组里,然后再读取出来还原为一个整数

问题描述 c语言:如何把一个整数按位保存在一个字符数组里,然后再读取出来还原为一个整数 void WitedataToFlash(void) { unsigned char i; sprintf(datal, "%luunsignedlong", gdvolt); for(i=0;i<11;i++) EEPROM_write(0x01+i,datal[i]); } /*********************************************************