数据结构-哈夫曼(Huffman)
#include <iostream>
#include <cstdio>
#include <malloc.h>
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAX 0xcfcfcfcf
using namespace std;
typedef struct
{
unsigned int weight;
unsigned int parent, lchild, rchild;
} HTNode, *HUffmanTree;
void select(HUffmanTree HT, int n, int *s1, int *s2);
void found(HUffmanTree ht, int i, int j, char *c);
void HUffmanCoding(HUffmanTree *HT, int *w, int n);
int main()
{
char c[10];
int w[10] = {5,29,7,8,14,23,3,11};
HUffmanTree HT;
HUffmanCoding(&HT,w,8);//8是数组长度
for(int i=0; i<8; i++) printf("%d%c",w[i],i==7?'\n':' ');
found(HT,14,0,c);//14是树根所在位置
return 0;
}
void select(HUffmanTree HT, int n, int *s1, int *s2)
{
unsigned int min1, min2;
min1 = min2 = MAX;
for(int i = 0; i < n; i++)
{
if(HT[i].weight <= min1&& !HT[i].parent)
{
min2 = min1;
*s2 = *s1;
min1 = HT[i].weight;
*s1 = i;
}
else if(HT[i].weight < min2&& !HT[i].parent)
{
min2 = HT[i].weight, *s2 = i;
}
}
}
void found(HUffmanTree ht, int i, int j, char *c)
{
if(ht[i].lchild==0 && ht[i].rchild==0)
{
c[j] = '\0';
printf("i:%-2d w:%-2d char:%s\n", i, ht[i].weight, c);
return;
}
c[j] = '1';
found(ht,ht[i].lchild,j+1,c);
c[j] = '0';
found(ht,ht[i].rchild,j+1,c);
return;
}
void HUffmanCoding(HUffmanTree *HT, int *w, int n)
{
int s1, s2;
if(!n) return;
*HT = (HUffmanTree)malloc((2*n)*sizeof(HTNode));
HUffmanTree p = *HT;
for(int i = 0; i< n; i++)
{
p[i].lchild = p[i].rchild = p[i].parent = 0;
p[i].weight = w[i];
}
for(int i =n; i < 2*n; i++)
{
p[i].weight = p[i].lchild = p[i].rchild = p[i].parent = 0;
}
for(int i = n; i < 2*n-1; i++)
{
select(*HT, i, &s1, &s2);
p[s1].parent = i, p[s2].parent = i;
p[i].lchild = s1, p[i].rchild = s2;
p[i].weight = p[s1].weight + p[s2].weight;
}
printf("Weight parent lchild rchild\n");
for(int i = 0; i < 2*n-1; i++)
printf(" %-4d %-4d %-4d %-4d\n",p[i].weight, p[i].parent, p[i].lchild, p[i].rchild);
printf("----------------------------------\n");
return;
}
数据结构-哈夫曼(Huffman)的更多相关文章
- 数据结构实训——哈夫曼(Huffman)编/译码器
题目4.哈夫曼(Huffman)编/译码器(限1人完成) [问题描述] 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.但是,这要求在发送端通过一个编码系统对待传数据预先 ...
- [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 哈夫曼(Huffman)编码
哈夫曼编码(Huffman Coding)是一种非常经典的编码方式,属于可变字长编码(VLC)的一种,通过构造带权路径长度最小的最优二叉树以达到数据压缩的目的.哈弗曼编码实现起来也非常简单,在实际的笔 ...
- 哈夫曼(Huffman)树+哈夫曼编码
前天acm实验课,老师教了几种排序,抓的一套题上有一个哈夫曼树的题,正好之前离散数学也讲过哈夫曼树,这里我就结合课本,整理一篇关于哈夫曼树的博客. 主要摘自https://www.cnblogs.co ...
- 重温经典之赫夫曼(Huffman)编码
先看看赫夫曼树假设有n个权值{w1,w2,…,wn},构造一个有n个叶子结点的二叉树,每个叶子结点权值为wi,则其中带权路径长度WPL最小的二叉树称作赫夫曼树或最优二叉树. 赫夫曼树的构造,赫夫曼最早 ...
- 数据结构-哈夫曼树(python实现)
好,前面我们介绍了一般二叉树.完全二叉树.满二叉树,这篇文章呢,我们要介绍的是哈夫曼树. 哈夫曼树也叫最优二叉树,与哈夫曼树相关的概念还有哈夫曼编码,这两者其实是相同的.哈夫曼编码是哈夫曼在1952年 ...
- C#数据结构-赫夫曼树
什么是赫夫曼树? 赫夫曼树(Huffman Tree)是指给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小.哈夫曼树(也称为最优二叉树)是带权路径长度最短的树,权值较大的结点 ...
- Java数据结构和算法(四)赫夫曼树
Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
随机推荐
- Java学习笔记--继承和多态(上)
1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...
- xml 文件转化Dictionary
下面是xml文件 <?xml version="1.0" encoding="utf-8" ?><nodes> <国土局> ...
- JavaSE_2_关键字
1.介绍一下Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么? synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下四种: ...
- blog 题解目录
洛谷: 1.P2430 严酷的训练 2.CF784E Twisted Circuit 3.P1886 滑动窗口 4.P1090 合并果子 5.P1119 灾后重建 6.P1690 贪婪的Copy 7. ...
- jquery中的置顶,置底,向上,向下的排序功能
css .selectedLi{background: #f0ad4e;color:#fff;} html部分 <ul class="seetSelect2" id='sys ...
- nsight 中出现method could not be resolved 报错
解决的方法就是现在编译选项中取消该报错. 项目右键->属性->c/c++常规->Code Analysis,选择"Use project settings" 中 ...
- Eucalyptus-instance启动后查看运行状态
1.前言 在eucalyptus中通过虚拟机模板,创建并启动一个虚拟机,这个时候虚拟机启动正常,但是外部一直无法访问也ping不通,正对这种情况我们如何检查排除问题呢? 两种检查问题的方法: 1).在 ...
- Python学习笔记-day1(if流程控制)
在python中,流程控制语句为强制缩进(4空格) if username=='lmc' and password=='123456': print('Welcome User {name} logi ...
- Visual Studio 2015 Preview 使用中问题一枚
只要碰到IO读写,文件不存在之类的系统异常,就会崩溃一下给你看看.直接重新VS. 不该有的问题确实存在着???? 正常情况是这样的 直接崩溃时万万不行的!!!!
- iOS解析新浪微博的@##以及URL链接并展示
最近在做一个跟微博相关的应用.其中涉及到了对微博中@.##以及URL链接的解析与展示.分享一下个人处理的方式,希望对需要的人有所帮助. 最终的展现效果: 首先,第一步是你得从纯文本中找到它们.毫无疑问 ...