【数据结构】Huffman树
参照书上写的Huffman树的代码 结构用的是线性存储的结构 不是二叉链表 里面要用到查找最小和第二小 理论上锦标赛法比较好 但是实现好麻烦啊 考虑到数据量不是很大 就直接用比较笨的先找最小 去掉最小再找第二小的方法了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct{
unsigned int weight;
unsigned int parent, lchild, rchild;
}HTNode, *HuffmanTree; typedef char ** HuffmanCode; int Select(HuffmanTree HT, int n, int &s1, int &s2)
{
if(n <= ) return ;
else
{
int i;
s1 = ; s2 = ;
for(i = ; i <= n; i++)
{
if(s1 == && HT[i].parent == )
{
s1 = i;
}
else if(HT[i].parent == && HT[i].weight < HT[s1].weight && s1 != )
{
s1 = i;
}
}
for(i = ; i <= n; i++)
{
if(i == s1)
{
continue;
}
else if(s2 == && HT[i].parent == )
{
s2 = i;
}
else if(HT[i].parent == && HT[i].weight < HT[s2].weight && s2 != )
{
s2 = i;
}
}
}
return ;
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int * w, int n)
{
if(n <= ) return;
int m = * n - ;
HuffmanTree p;
int i;
HT = (HuffmanTree)malloc((m + ) * sizeof(HTNode));
for(p = HT, i = ; i <= n; i++, p++, w++) //初始化
{
p->weight = *w; p->parent = ; p->rchild = ; p->lchild = ;
}
for( ; i <= m; i++, p++)
{
p->weight = ; p->parent = ; p->rchild = ; p->lchild = ;
} for(i = n + ; i <= m; i++) //建Huffman树
{
int s1, s2;
Select(HT, i - , s1, s2);
HT[s1].parent = i; HT[s2].parent = i;
HT[i].lchild = s1; HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
HT[i].parent = ; //不加这句会出错
} HC = (HuffmanCode)malloc((n + ) * sizeof(char *));
char * cd = (char *)malloc(n * sizeof(char));
cd[n - ] = '\0';
for(i = ; i <= n; i++)
{
int start = n - ;
int c, f;
for(c = i, f = HT[i].parent; f != ; c = f, f = HT[f].parent)
{
if(HT[f].lchild == c) cd[--start] = '';
else{ cd[--start] = '';}
}
HC[i] = (char *)malloc((n - start) * sizeof(char));
strcpy(HC[i], &cd[start]);
}
free(cd);
} int main()
{
int N = ; //一共10个权值
int w[] = {,,,,,,,,,};
HuffmanTree HT;
HuffmanCode HC;
HuffmanCoding(HT, HC, w, N); int i, j;
for(i = ; i <= N; i++)
{
printf("%d: ", i);
for(j = ; HC[i][j] != '\0'; j++)
{
printf("%c", HC[i][j]);
}
printf("\n");
} return ;
}
【数据结构】Huffman树的更多相关文章
- 数据结构之Huffman树与最优二叉树
最近在翻炒一些关于树的知识,发现一个比较有意思的二叉树,huffman树,对应到离散数学中的一种名为最优二叉树的路径结构,而Huffman的主要作用,最终可以归结到一种名为huffman编码的编码方式 ...
- 数据结构(三) 树和二叉树,以及Huffman树
三.树和二叉树 1.树 2.二叉树 3.遍历二叉树和线索二叉树 4.赫夫曼树及应用 树和二叉树 树状结构是一种常用的非线性结构,元素之间有分支和层次关系,除了树根元素无前驱外,其它元素都有唯一前驱. ...
- [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [数据结构] 2.2 Huffman树
注:本文原创,转载请注明出处,本人保留对未注明出处行为的责任追究. 1.Huffman树是什么 Huffman树也称为哈夫曼编码,是一种编码方式,常用于协议的制定,以节省传输空间. A - F字母,出 ...
- 数据结构与算法(周鹏-未出版)-第六章 树-6.5 Huffman 树
6.5 Huffman 树 Huffman 树又称最优树,可以用来构造最优编码,用于信息传输.数据压缩等方面,是一类有着广泛应用的二叉树. 6.5.1 二叉编码树 在计算机系统中,符号数据在处理之前首 ...
- 数据结构(二十七)Huffman树和Huffman编码
Huffman树是一种在编码技术方面得到广泛应用的二叉树,它也是一种最优二叉树. 一.霍夫曼树的基本概念 1.结点的路径和结点的路径长度:结点间的路径是指从一个结点到另一个结点所经历的结点和分支序列. ...
- 数据结构-二叉树(6)哈夫曼树(Huffman树)/最优二叉树
树的路径长度是从树根到每一个结点的路径长度(经过的边数)之和. n个结点的一般二叉树,为完全二叉树时取最小路径长度PL=0+1+1+2+2+2+2+… 带权路径长度=根结点到任意结点的路径长度*该结点 ...
- HUFFMAN 树
在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么 ...
- Huffman编码(Huffman树)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...
随机推荐
- BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...
- 洛谷P1130 红牌
题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了 ...
- 中间件、MetaQ入门学习
目录 . 中间件技术 . MetaQ中间件 . MetaQ编程实践 1. 中间件技术 0x1: 中间件简介 中间件(Middleware)是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的 ...
- 关于updateElement接口
1.bool UpdateGameElement(const struct_game_element& ele, gs_dbs_user_info_op_req& db_req, :: ...
- Java 获取距离最近一段时间的时间点
if (timeFilter == 1) {// 最近三个月 long curTimeSeconds = System.currentTimeMillis() / 1000L; para.put(&q ...
- centos7中systemctl命令使用方法和心得体会
使用linux的同学对service和chkconfig两个命令都不陌生,其重要性不言而喻,那么怎么会突然冒出个systemctl命令呢?其实,为了简化操作,systemctl命令将service和c ...
- 通过telnet连接查看memcache服务器(转)
memcache作为一款优秀的进程外缓存,常常被运用于高并发系统架构中.这里主要谈谈怎么通过telnet工具,查看memcache运行状况并对其key进行管理维护.假设memcache安装目录:/us ...
- C#实现AES加解密方法
using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptograph ...
- 转>>在同一个sql语句中如何写不同条件的count数量
今天在做Portal中的Dashboard展现的时候,需要对多个统计字段做展现,根据我现在的掌握水平,我只能在sql调用构建器中实现一种sql语 句返回的resultSet做展现.没有办法,只能从数据 ...
- 唐巧的iOS技术博客选摘
1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/ 2. 使用cr ...