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. Third week-homework(员工管理系统)

    需求: 可以查询员工所有信息 可以修改员工信息 可以增加新员工 code: import sys,json # yuangong = { # "1": ["faker&q ...

  2. CSS基础语法(三) CSS的6种特性

    样式表常用写法及特性(组合.继承.关联性.权值性.层叠性.重要性) 1.样式的组合:把具有相同声明定义的选择符组合在一起,并用逗号隔开.-例如:段落元素p.单元格元素td和类c1可以使用相同样式: p ...

  3. Jerry的WebClient UI 42篇原创文章合集

    我要感谢CRM On Premise, 因为在这个产品上做开发让我得以使用WebClient UI框架.有些朋友觉得这个SAP自己发明的基于HTML+ABAP的MVC框架,和现在流行的三驾马车(Ang ...

  4. JQuery前端技术记录

    [Jquery-leearning notes-2015]by lijun 1   Jquery是javascript实现的库,目标在于改变web应用的高交互性的方式. 其不唐突性:样式(.css). ...

  5. Android(java)学习笔记14:Java线程池

    1. 线程池: 1)程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互.而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池. 2)线程池里 ...

  6. CodeForces 30C Shooting Gallery 简单dp

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq574857122/article/details/36944227 题目链接:点击打开链接 给定 ...

  7. POJ 3734 生成函数

    题意:一排n长度的砖,有四种颜色,红色绿色是偶数,有少染色方式. 分析: 泰勒展开式: chx = (e^x+e^(-x))/2 = 1 + x^2/2! + x^4/4! + x^6/6! + .. ...

  8. 行云管家V4.9正式发布:监控全面提升,首页、主机详情大幅优化,新增大量实用功能.md

    让大家久等啦!4.9版本中我们对监控模块进行了重构,在数据准确性与稳定性方面做了大幅提升.我们也对首页及主机详情页面做了大幅重构,以追求为您提供极致的用户体验.同时我们在新版本中增加了如:运维报表.用 ...

  9. axios简单了解

    简单介绍 axios是基于客户端的promise,面向浏览器和nodejs 特色 浏览器端发起XMLHttpRequests请求 node端发起http请求 支持Promise API 监听请求和返回 ...

  10. JavaScript闭包简单学习

    因为实验室项目要用,所以最近在学习OpenLayers,但是从来没有做过前端呀,坑爹的,硬着头皮上吧 反正正好借这个机会学习一下JS,本来对这门语言也挺感兴趣的,多多少少写过一下JS代码了,差不多学一 ...