时 限:

1000 ms

内存限制:

10000 K

总时限:

3000 ms

描述:

Huffman树

对输入的英文大写字母进行统计概率 然后构建哈夫曼树,输出是按照概率降序排序输出Huffman编码。

输入:

大写字母个数 n

第一个字母 第二个字母 第三个字母 ...  第n个字母

输出:

字母1 出现次数 Huffman编码

字母2 出现次数 Huffman编码

字母3 出现次数 Huffman编码

字母n 出现次数 Huffman编码

输入样例:

10

I I U U U I U N U U

输出样例:

U 6 1

I 3 01

N 1 00

1 #include <stdio.h>
2 #include <malloc.h>
3 #include <string.h>
4
5 #define MAX_INT 99999
6
7 typedef struct
8 {
9 int weight;
10 int parent;
11 int lchild;
12 int rchild;
13 }HTNode ,*HuffmanTree;
14 typedef char **HuffmanCode;
15 typedef struct
16 {
17 char Char;
18 int times;
19 char h[20];
20 }HuffmanNode;
21
22 void HuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int *w,int n);
23 void Select(HuffmanTree&HT,int n,int &s1,int &s2);
24
25 int main()
26 {
27 int a[26];int n,i,j,m=0;char b,*y;int *c;
28 int k=0;int xx=0;
29 HuffmanTree HT;HuffmanCode HC;HuffmanNode*x;
30 HuffmanNode e;
31 scanf("%d",&n);
32 getchar();
33 for(i=0;i<26;i++)
34 {
35 a[i]=0;
36 }
37 for(i=0;i<n;i++)
38 {
39 scanf("%c",&b);
40 getchar();
41 (a[b-'A'])++;
42 }
43 for(i=0;i<26;i++)
44 {
45 if(a[i]!=0) m++;
46
47 }
48 c=(int*)malloc((m+1)*sizeof(int));
49 y=(char*)malloc((m+1)*sizeof(char));
50 for(i=0;i<26;i++)
51 {
52 if(a[i]!=0)
53 {
54 c[k++]=a[i];
55
56 y[xx++]='A'+i;
57 }
58 }
59 HuffmanCoding(HT,HC,c,k);
60 x=(HuffmanNode*)malloc(k*sizeof(HuffmanNode));
61 for(i=0;i<k;i++)
62 {
63 x[i].Char=y[i];
64 strcpy(x[i].h,HC[i+1]);
65 x[i].times=c[i];
66 }
67 for(i=0;i<k-1;i++)
68 {
69
70 for(j=k-1;j>=1;j--)
71 {
72 if(x[j].times>x[j-1].times)
73 {
74 e=x[j];x[j]=x[j-1];x[j-1]=e;
75 }
76 }
77 }
78
79 for(i=0;i<k;i++)
80 {
81 printf("%c %d %s\n",x[i].Char,x[i].times,x[i].h);
82 }
83
84 return 0;
85 }
86
87
88 int min(HuffmanTree t,int i)
89 {
90
91 int j,flag;
92 int k=MAX_INT; // 取k为不小于可能的值
93 for(j=1;j<=i;j++)
94 if(t[j].weight<k&&t[j].parent==0)
95 k=t[j].weight,flag=j;
96 t[flag].parent=1;
97 return flag;
98
99 }
100 void select(HuffmanTree&t,int i,int &s1,int &s2)
101 {
102
103 s1=min(t,i);
104 s2=min(t,i);
105
106
107 }
108
109 void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) // 算法6.12
110 { // w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
111 int m,i,s1,s2,start;
112 int c,f;
113 HuffmanTree p;
114 char *cd;
115 if(n<=1)
116 return;
117 m=2*n-1;
118 HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用
119 for(p=HT+1,i=1;i<=n;++i,++p,++w)
120 {
121 (*p).weight=*w;
122 (*p).parent=0;
123 (*p).lchild=0;
124 (*p).rchild=0;
125 }
126 for(;i<=m;++i,++p)
127 (*p).parent=0;
128 for(i=n+1;i<=m;i++) // 建赫夫曼树
129 { // 在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2
130 select(HT,i-1,s1,s2);
131 HT[s1].parent=HT[s2].parent=i;
132 HT[i].lchild=s1;
133 HT[i].rchild=s2;
134 HT[i].weight=HT[s1].weight+HT[s2].weight;
135 }
136 // 从叶子到根逆向求每个字符的赫夫曼编码
137 HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
138 // 分配n个字符编码的头指针向量([0]不用)
139 cd=(char*)malloc(n*sizeof(char)); // 分配求编码的工作空间
140 cd[n-1]='\0'; // 编码结束符
141 for(i=1;i<=n;i++)
142 { // 逐个字符求赫夫曼编码
143 start=n-1; // 编码结束符位置
144 //for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
145 c=i;f=HT[i].parent;
146 while(f!=0)
147 {
148 --start;
149 if(HT[f].lchild==c) cd[start]='0';
150 else
151 cd[start]='1';
152 c=f;f=HT[f].parent;
153
154 }
155
156 HC[i]=(char*)malloc((n-start)*sizeof(char));
157 // 为第i个字符编码分配空间
158 strcpy(HC[i],&cd[start]); // 从cd复制编码(串)到HC
159 }
160 free(cd); // 释放工作空间
161 }

转载于:https://www.cnblogs.com/huzhongzhong/archive/2011/06/05/anyone.html

标题: Huffman树相关推荐

  1. 深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)

    文章目录 一.C语言能干大事 1. C语言下Huffman树的计算过程分析 2. C语言下Huffman树的编程 二.C#语言也不赖 1. C#下Huffman类的设计 2. C#中界面设计 3. 建 ...

  2. huffman树和huffman编码

    不知道为什么,我写的代码都是又臭又长. 直接上代码: #include <iostream> #include <cstdarg> using namespace std; c ...

  3. 数据结构源码笔记(C语言):Huffman树字符编码

    #include <stdio.h> #include<string.h> #define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/ #define M 2* ...

  4. 数据结构实验三:Huffman树及Huffman编码的算法实现

    Exp03 Huffman树及Huffman编码的算法实现 Author: Maskros 实验目的 了解该树的应用实例,熟悉掌握Huffman树的构造方法及Huffman编码的应用, 了解Huffm ...

  5. 数据结构-Huffman树

    Huffman树的编码和解码 思想:1.统计字符串每个字母出现的个数2.依次取出两个最小的字母进行合并(分别作为左右子节点,另左子节点<右子节点的值),使用他们值之和作为根节点的值,并将根节点加 ...

  6. Huffman编码(Huffman树)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...

  7. Huffman树进行编码和译码

    //编码 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...

  8. huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码

    艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...

  9. Huffman树压缩和解压文件

    Huffman树 Huffman树:以静态三叉链的存储结构建立的二叉树 Huffman树是一个带权路径长度最小的二叉树,又称最优二叉树 Huffman树的构造方法 ①将每个结点都看作是一个树: ②选择 ...

  10. python构建huffman树_python:哈夫曼树,PythonHuffuman

    Python:Huffuman树 题目 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列 ...

最新文章

  1. 怎么查看自己电脑的配置_怎么查看自己网卡是千兆网卡还是百兆网卡
  2. 开启Windows或者Mac OSX 本地服务器 (非安装第三方服务器软件)
  3. 【会议/期刊】中科院推荐计算机领域人工智能方向会议和期刊列表
  4. c语言程序设计小学期论文,c语言程序设计小学期.pdf
  5. 微课|玩转Python轻松过二级(1.1节):Python命令式编程与函数式编程模式
  6. Zookeeper概念学习系列之zookeeper是什么?
  7. Linux宝库名人轶事栏目 | 我与中国开源软件二十年(三)
  8. android如何使用代码截屏,android实现截屏功能代码
  9. sfm点云代码_SfM实现过程分析
  10. gdb 查看是否 栈溢出_64位Linux栈溢出教程
  11. python的注释符号有哪些_python注释符号
  12. 云架构Linux运维,【Linux云计算架构:第三阶段-Linux高级运维...
  13. 如何解决笔记本电脑不接电源自动断网的问题?
  14. python中文分句_中文文本分句
  15. web网页设计期末课程大作业:水果网站设计——HTML+CSS+JavaScript水果超市(带论文)
  16. 阿里巴巴Java岗位从P5-P7的成长笔记【总共3283页PDF文档】
  17. oracle索引介绍
  18. 智能手机防盗软件测试自学,用谁找回手机几率最大?手机防盗软件功能大PK
  19. 本周三、五,武汉专场丨华为鲲鹏校企人才双选会火热来袭!
  20. 软件测试6年工作总结--转

热门文章

  1. python卷积函数_Convolution卷积算法python以numpy,Matplotlib实现
  2. 【渝粤教育】国家开放大学2018年春季 0248-22T电工电子技术 参考试题
  3. [渝粤教育] 西南科技大学 土木工程施工 在线考试复习资料(2)
  4. 铋- Bismuth
  5. Numpy系列(二)对数组按索引查询
  6. 计算机视觉实战(四)图像形态学操作
  7. 简析平衡树(四)——FHQ Treap
  8. 北京2018网络赛 hihocoder#1828 : Saving Tang Monk II (BFS + DP +多开一维)
  9. C#知识点:操作XML
  10. Vijos1906 联合权值 NOIP2014Day1T2 树形动态规划