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. ORACLE_DELETE

    SQL DELETE Statement The SQL DELETE Statement The DELETE statement is used to delete existing record ...

  2. ORACLE不使用工具的情况下获取对象DDL

    set line 200set pagesize 0set long 99999set feedback offset echo off获得表.索引.视图.存储过程.函数的DDL:select dbm ...

  3. June 06th 2017 Week 23rd Tuesday

    At the touch of love, everyone becomes a poet. 一谈到爱,每个人都变成了一位诗人. Sweet words always have the power o ...

  4. 从产品展示页面谈谈Hybris的特有概念和设计结构

    今天这篇文章来自我的同事,SAP成都研究院Hybris开发团队的开发人员Zhang Jonathan(张健).需要特别介绍的是,张健和成都研究院的其他开发同事不同,张健毕业于电子科技大学,读的专业是英 ...

  5. Android(java)学习笔记46:反射机制

    1. 反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...

  6. HDU 6034 6038

    6034:给每个字母26进制的贪心.例如一个字母 c = 7*26^89 + 6*26^50.... 这个字符串有10^5长度.普通的大整数会超时,这里要稀疏这个大数一个pair<int,int ...

  7. Uva 11600 期望DP

    题意:n个城市,相互可达(有n(n-1)/2条边),其中有一些道路上面有妖怪,现在,从1号城市出发,随机挑取一个城市走去,这个道路上的妖怪就会被消灭,求: 在平均情况下,需要走多少步,使得任意两个城市 ...

  8. Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) C. Vasya and Golden Ticket 【。。。】

    任意门:http://codeforces.com/contest/1058/problem/C C. Vasya and Golden Ticket time limit per test 1 se ...

  9. sql得到表中的列信息

    取列全部用的 sys. 中的表 CTE:WITH name AS() 用法:   sql树形查询 ①主键信息 SELECT ic.column_id, ic.index_column_id, ic.o ...

  10. caffe+opencv3.3.1

    跟着时代走 换成opencv3.3.1,目前来看所有的都是最新版了. anaconda最新,opencv最新,我看了protobuf也很新. 下次再买台服务器时,我想直接用python来弄,因为这次安 ...