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. JavaScript 三种工厂模式

    标签(空格分隔): JavaScript 简单工厂模式是工厂函数返回实例化对象或者对象,工厂函数作为一个方法. 工厂方法模式是工厂函数不作改变,将子类放在工厂原型中:工厂函数返回对应的实例化对象:re ...

  2. TELNET_COMMAND

    TELENT COMMAND DEFINE:Telnet is a command control your cmd windows of remote computer. step: 1.Open ...

  3. Excel-怎样实现行列转置

    有时候,我们为了某些需要,必须把工作表的行列进行转置的方式显示.重新输入很浪费时间,怎样简单的实现转置呢,强大的excel2007提供了此项功能,具体怎么做,下面看我来演示一下. 工具/原料   装有 ...

  4. java 解压缩Zip文件 ziputil

    package com.lanyuan.assembly.util; import java.io.BufferedOutputStream;import java.io.File;import ja ...

  5. UESTC-1259 昊昊爱运动 II

    昊昊爱运动 II Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)     昊昊喜 ...

  6. hdu1215 七夕节---因子和

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1215 题目大意: 求N的因子和(不包括N本身) 解题思路: 模板传送门 #include<io ...

  7. 论C/C++数据在内存中的二进制存放形式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010518429/article/details/30332237 // enter any ty ...

  8. cocos2dx-打敌人游戏(一)

    參照视频: http://v.youku.com/v_show/id_XNjk5MzExNDYw.html 1.參照前一篇文章创建新项目: http://blog.csdn.net/simakongc ...

  9. OpenCV人脸识别

    import cv2 filename = 'pic.jpg' def detect(filename): face_cascade = cv2.CascadeClassifier('./haarca ...

  10. JDK下载

    1.进入Java官网,方式不限,如百度“Java 官网”,www.oracle.com,找到Java SE -> download.链接如下: http://www.oracle.com/tec ...