贪心算法之Huffman
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的更多相关文章
- 贪心算法——Huffman 压缩编码的实现
1. 如何理解 "贪心算法" 假设我们有一个可以容纳 100 Kg 物品的背包,可以装各种物品.我们有以下 5 种豆子,每种豆子的总量和总价值都各不相同.怎样装才能让背包里豆子的总 ...
- [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)
一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...
- 关于贪心算法的经典问题(算法效率 or 动态规划)
如题,贪心算法隶属于提高算法效率的方法,也常与动态规划的思路相挂钩或一同出现.下面介绍几个经典贪心问题.(参考自刘汝佳著<算法竞赛入门经典>).P.S.下文皆是我一个字一个字敲出来的,绝对 ...
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...
- 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 ...
- ACM_ICPC hdu-2111(简单贪心算法)
一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
- 增强学习贪心算法与Softmax算法
(一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...
随机推荐
- yjh_study_command
1.show current user in oralce ansower:show user 2.search name of table in current user model. answ ...
- 【Spring实战】—— 9 AOP环绕通知
假如有这么一个场景,需要统计某个方法执行的时间,如何做呢? 典型的会想到在方法执行前记录时间,方法执行后再次记录,得出运行的时间. 如果采用Spring的AOP,仅仅使用前置和后置方法是无法做到的,因 ...
- 利用Docker volume修改Nginx Docker镜像里index.html
通过这个小例子我们可以进一步加深对Docker volume概念的理解和使用方法. 我们都知道运行基于Docker的Nginx镜像后,访问localhost能看到Nginx默认的首页,这个首页的位置是 ...
- 如何使用Kubernetes里的NetworkPolicy
创建一个类型为NetworkPolicy的Kubernetes对象的yaml文件. 第九行的podSelector指定这个NetworkPolicy施加在哪些pod上,通过label来做pod的过滤. ...
- IOS 通讯录 (访问,添加,修改)
如何访问用户的通讯录 在iOS中,有2个框架可以访问用户的通讯录 AddressBookUI.framework 提供了联系人列表界面.联系人详情界面.添加联系人界面等 一般用于选择联系人 Add ...
- linux自动备份文件 并上传到远程服务器 脚本实现
(1)在服务器上创建备份目录,并赋予权限 mkdir -p /backup/bakdata #新建数据备份目录(2)完成备份脚本操作新建脚本文件 vi bakdata.sh添加 ...
- ACM-ICPC(10/21)
写一发后缀数组套路题,看起来简单,写起来要人命哦~~~ 总共13题. 分两天debug吧,有点累了~~~ suffix(后缀数组的应用) sa[i] :排名第 i 的后缀在哪(i 从 1 开始) ra ...
- 2018.10.4 AndroidStudio
AndroidStudio低版本sdkversion开发 Error:Minimum supported Gradle version is 4.1 Current version is 2.14.1 ...
- php 的 number_format使用
$num = 1.0258963147; // 1.0259 $num = number_format($num, 4, '.', ''); $num = number_format($num); $ ...
- idea 一次性自动导包
当复制粘贴一段纯文本代码时,许多类需要导包. 如图 使用optimize imports了,发还是没有办法导入未导入的包,只能删除未使用导包,这跟eclipse不一样,让人很不习惯,查了好多资料都没有 ...