标题: Huffman树
时 限: |
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 |
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树相关推荐
- 深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)
文章目录 一.C语言能干大事 1. C语言下Huffman树的计算过程分析 2. C语言下Huffman树的编程 二.C#语言也不赖 1. C#下Huffman类的设计 2. C#中界面设计 3. 建 ...
- huffman树和huffman编码
不知道为什么,我写的代码都是又臭又长. 直接上代码: #include <iostream> #include <cstdarg> using namespace std; c ...
- 数据结构源码笔记(C语言):Huffman树字符编码
#include <stdio.h> #include<string.h> #define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/ #define M 2* ...
- 数据结构实验三:Huffman树及Huffman编码的算法实现
Exp03 Huffman树及Huffman编码的算法实现 Author: Maskros 实验目的 了解该树的应用实例,熟悉掌握Huffman树的构造方法及Huffman编码的应用, 了解Huffm ...
- 数据结构-Huffman树
Huffman树的编码和解码 思想:1.统计字符串每个字母出现的个数2.依次取出两个最小的字母进行合并(分别作为左右子节点,另左子节点<右子节点的值),使用他们值之和作为根节点的值,并将根节点加 ...
- Huffman编码(Huffman树)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...
- Huffman树进行编码和译码
//编码 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...
- huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码
艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...
- Huffman树压缩和解压文件
Huffman树 Huffman树:以静态三叉链的存储结构建立的二叉树 Huffman树是一个带权路径长度最小的二叉树,又称最优二叉树 Huffman树的构造方法 ①将每个结点都看作是一个树: ②选择 ...
- python构建huffman树_python:哈夫曼树,PythonHuffuman
Python:Huffuman树 题目 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列 ...
最新文章
- 怎么查看自己电脑的配置_怎么查看自己网卡是千兆网卡还是百兆网卡
- 开启Windows或者Mac OSX 本地服务器 (非安装第三方服务器软件)
- 【会议/期刊】中科院推荐计算机领域人工智能方向会议和期刊列表
- c语言程序设计小学期论文,c语言程序设计小学期.pdf
- 微课|玩转Python轻松过二级(1.1节):Python命令式编程与函数式编程模式
- Zookeeper概念学习系列之zookeeper是什么?
- Linux宝库名人轶事栏目 | 我与中国开源软件二十年(三)
- android如何使用代码截屏,android实现截屏功能代码
- sfm点云代码_SfM实现过程分析
- gdb 查看是否 栈溢出_64位Linux栈溢出教程
- python的注释符号有哪些_python注释符号
- 云架构Linux运维,【Linux云计算架构:第三阶段-Linux高级运维...
- 如何解决笔记本电脑不接电源自动断网的问题?
- python中文分句_中文文本分句
- web网页设计期末课程大作业:水果网站设计——HTML+CSS+JavaScript水果超市(带论文)
- 阿里巴巴Java岗位从P5-P7的成长笔记【总共3283页PDF文档】
- oracle索引介绍
- 智能手机防盗软件测试自学,用谁找回手机几率最大?手机防盗软件功能大PK
- 本周三、五,武汉专场丨华为鲲鹏校企人才双选会火热来袭!
- 软件测试6年工作总结--转
热门文章
- python卷积函数_Convolution卷积算法python以numpy,Matplotlib实现
- 【渝粤教育】国家开放大学2018年春季 0248-22T电工电子技术 参考试题
- [渝粤教育] 西南科技大学 土木工程施工 在线考试复习资料(2)
- 铋- Bismuth
- Numpy系列(二)对数组按索引查询
- 计算机视觉实战(四)图像形态学操作
- 简析平衡树(四)——FHQ Treap
- 北京2018网络赛 hihocoder#1828 : Saving Tang Monk II (BFS + DP +多开一维)
- C#知识点:操作XML
- Vijos1906 联合权值 NOIP2014Day1T2 树形动态规划