Huffman编码,权重越大,离根节点越大。所以就是不断的选取两个最小的树,然后组成一颗新树,加入集合,然后去除已选的两棵树。不断的循环,直到最后的树的集合只剩下一棵,则构建完成,最后输出Huffman编码即可。

具体代码如下:

#include <iostream>

using namespace std;

#define MAXLEAF 30
#define MAXNODE MAXLEAF*2-1
#define MAXWEIGHT 10000 typedef struct {
double weight;
int parent;
int lchild;
int rchild;
char value;
} HNodeType; typedef struct {
int bit[MAXLEAF];
int start;
} HCodeType; HNodeType huffNode[MAXNODE]; //节点数组
HCodeType huffCode[MAXLEAF]; //编码数组 void HuffmanTree(HNodeType node[MAXNODE], int n); //构建哈夫曼树 void HuffmanCode(HCodeType code[MAXLEAF], int n); int main() {
int n;
cout << "请输入共有多少字符:";
cin >> n;
HuffmanTree(huffNode, n);
HuffmanCode(huffCode, n);
for(int i = ; i < n; i++){
cout<<huffNode[i].value<<"的Huffman编码:";
for(int j = huffCode[i].start + ; j < n; j++){
cout<<huffCode[i].bit[j];
}
cout<<endl;
}
} void HuffmanCode(HCodeType code[MAXLEAF], int n) {
HCodeType temp;
int c, p;
for(int i = ; i < n; i++){
cout<<"开始计算第"<<i<<"个Huffman..."<<endl;
temp.start = n-;
c = i;
p = huffNode[c].parent;
while(p != -){
if(huffNode[p].lchild == c)
temp.bit[temp.start] = ;
else
temp.bit[temp.start] = ;
temp.start--;
c = p;
p = huffNode[c].parent;
}
for(int j = temp.start+; j < n; j++){
huffCode[i].bit[j] = temp.bit[j];
}
huffCode[i].start = temp.start;
}
} void HuffmanTree(HNodeType node[MAXNODE], int n) { for (int i = ; i < * n - ; i++) {//初始化节点
huffNode[i].weight = ;
huffNode[i].parent = -;
huffNode[i].lchild = -;
huffNode[i].rchild = -;
}
cout << "请输入节点的值和权重:" << endl;
for (int i = ; i < n; i++) {
cin >> huffNode[i].value >> huffNode[i].weight;
}
cout << "开始构造哈夫曼树。。。" << endl;
for (int i = ; i < n - ; i++) {//执行n-1词合并
//找到最小的两个值
double w1 = MAXWEIGHT;
double w2 = MAXWEIGHT;
int x1 = -;
int x2 = -;
for (int j = ; j < n + i; j++) {//合并一次增加一个节点,所以合并第i次增加i个节点
if(huffNode[j].weight < w1 && huffNode[j].parent == -){
//权重小且无双亲节点
x2 = x1;
w2 = w1;
x1 = j;
w1 = huffNode[j].weight;
}else if(huffNode[j].weight < w2 && huffNode[j].parent == -){
//右节点
x2 = j;
w2 = huffNode[j].weight;
}
}
//初始化新增加的节点
huffNode[n+i].weight = huffNode[x1].weight + huffNode[x2].weight;
huffNode[n+i].lchild = x1;
huffNode[n+i].rchild = x2;
huffNode[x1].parent = n+i;
huffNode[x2].parent = n+i;
}
}

贪心算法之Huffman的更多相关文章

  1. 贪心算法——Huffman 压缩编码的实现

    1. 如何理解 "贪心算法" 假设我们有一个可以容纳 100 Kg 物品的背包,可以装各种物品.我们有以下 5 种豆子,每种豆子的总量和总价值都各不相同.怎样装才能让背包里豆子的总 ...

  2. [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)

    一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...

  3. 关于贪心算法的经典问题(算法效率 or 动态规划)

    如题,贪心算法隶属于提高算法效率的方法,也常与动态规划的思路相挂钩或一同出现.下面介绍几个经典贪心问题.(参考自刘汝佳著<算法竞赛入门经典>).P.S.下文皆是我一个字一个字敲出来的,绝对 ...

  4. 贪心算法(Greedy Algorithm)

    参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...

  5. 算法导论----贪心算法,删除k个数,使剩下的数字最小

    先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...

  6. LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  7. ACM_ICPC hdu-2111(简单贪心算法)

    一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...

  8. 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题

    1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...

  9. 增强学习贪心算法与Softmax算法

    (一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...

随机推荐

  1. 三个方法教会你win7中IIS7配置php环境

    三个方法教会你win7中IIS7配置php环境.今天静下心来研究了下在win7中使用IIS7配置php环境,其实很简单!跟下面方法做之前,请先确定你的电脑中未安装其它相关环境程序及服务,之前安装过ap ...

  2. 【图文详解】Zookeeper集群搭建(CentOs6.3)

    Zookeeper简介: Zookeeper是一个分布式协调服务,就是为用户的分布式应用程序提供协调服务的. A.zookeeper是为别的分布式程序服务的 B.Zookeeper本身就是一个分布式程 ...

  3. C++ 数据库 char 转 wchar_t SQLWCHAR

    C++中对数据库的操作感觉太复杂了,不如C#好使,但最近出于某些原因还是学习了一下C++下操作数据库的方法. 如果要想用C++实现对数据库的操作其实很简单,但是如果你需要动态的操作数据库(比如获得用户 ...

  4. 利用CRM中间件Middleware从ERP下载Customer Material的常见错误

    使用事务码VD51和VD52创建和修改Customer Material. 下图是我在ERP创建的Material,为其维护了一个Customer Material AOP. 当下载到CRM后,在We ...

  5. IOS 应用管理(九宫格) 总结笔记

    1. 开发前的思路 ========================================1> 从mainBundle中加载Plist2> 按照plist中的数据数量先确定各个a ...

  6. extension Kingfisher where Base: Image:泛型类型的具体化与实例化

    具体化:针对特定的类型参量进行二次定义: 实例化:实例化:

  7. 用keytool制作证书并在tomcat配置https服务(四)

    用keytool制作证书并在tomcat配置https服务(一) 用keytool制作证书并在tomcat配置https服务(二) 用keytool制作证书并在tomcat配置https服务(三) 上 ...

  8. Nodejs做整站转发

    刚接触nodejs,做个东西练下手,通过nodejs直接转发整站,原本想把内容全翻译成英文,但google对流量行审查,被封IP,所以就没啥用了, 效果像这样 var b = function (a, ...

  9. onsubmit校验表单时利用ajax的return false无效解决方法

    代码: function checkNewEmail(){ var re_email=new RegExp("\\w+@\\w+\\.\\w+\\.?\\w*"); var new ...

  10. 轻量ORM-SqlRepoEx (一)SqlRepoEx介绍

    一.SqlRepo项目 发现SqlRepo项目库是在构建自动代码工具时.对于数据访问,在.Net下,有很多选择,比如EF,但EF使用起来,不是很方便的.以前一直使用Atk.Expression库+Sy ...