Huffman编码

Huffman编码是一种可变字长编码,利用字频来作为结点的权重,代码如下,测试使用的是26个字母,频率使用的是Prime.

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <cmath>
using namespace std;
string road[26];
int key[26] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};struct Node
{int value = -1;int lchild = -1;int rchild = -1;int parent = -1;
};
int Select(Node tree[], int n)
{int min, i = 0;for(; i < n; i++)if(tree[i].value != -1 && tree[i].parent == -1){min = i;break;}for(; i < n; i++)if(tree[i].value != -1 && tree[i].parent == -1 && tree[i].value <= tree[min].value)min = i;return min;
}
string search(Node tree[], int i, string s, int num)
{if(tree[i].parent == -1)return (tree[i].lchild == num) ? "0" + s : "1" + s;if(tree[i].lchild == num)return search(tree, tree[i].parent, "0" + s, i);elsereturn search(tree, tree[i].parent, "1" + s, i);}
void Huffman(Node tree[], int n)
{for(int i = 0; i < n; i++)tree[i].value = key[i];int m = 2 * n - 1;for(int i = n; i < m; i++){int lmin, rmin;//查找权值最小的两个根节点保存在lmin和rmin中lmin = Select(tree, m);tree[lmin].parent = i;rmin = Select(tree, m);tree[rmin].parent = i;tree[i].value = tree[lmin].value + tree[rmin].value;tree[i].lchild = lmin;tree[i].rchild = rmin;}
}
int main()
{int n = 26;int m = n * 2 - 1;Node *tree = new Node[m];Huffman(tree, n);printf("    序号   权值   双亲   左孩   右孩\n");for(int i = 0; i < n; i++)printf("%c%7d%7d%7d%7d%7d\n", ('a' + i), i, tree[i].value, tree[i].parent, tree[i].lchild, tree[i].rchild);for(int i = n; i < m; i++)printf(" %7d%7d%7d%7d%7d\n", i, tree[i].value, tree[i].parent, tree[i].lchild, tree[i].rchild);printf("   编码\n");for(int i = 0; i < n; i++){road[i] = search(tree, tree[i].parent, "", i);printf("%c  ", ('a' + i));cout << road[i] << endl;}delete[] tree;system("pause");return 0;
}

Huffman编码代码相关推荐

  1. 数据压缩之Huffman编码

    数据压缩之Huffman编码 实验介绍 实验环境介绍和项目使用方法 1.对.img图像文件进行Huffman编码 2.编写diff程序得到差值图像,并进行Huffman编码 3.使用其他图像码本对图像 ...

  2. huffman python,哈夫曼(Huffman)编码python代码实现

    首先看定义 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率 ...

  3. DS二叉树——Huffman编码与解码(不含代码框架)

    题目描述 1.问题描述 给定n个字符及其对应的权值,构造Huffman树,并进行huffman编码和译(解)码. 构造Huffman树时,要求左子树根的权值小于.等于右子树根的权值. 进行Huffma ...

  4. Huffman 编码原理详解(代码示例)

    1.概述 huffman编码是一种可变长编码(  VLC:variable length coding))方式,于1952年由huffman提出.依据字符在需要编码文件中出现的概率提供对字符的唯一编码 ...

  5. huffman树和huffman编码

    不知道为什么,我写的代码都是又臭又长. 直接上代码: #include <iostream> #include <cstdarg> using namespace std; c ...

  6. 技术图文:如何利用C#实现Huffman编码?

    背景 Huffman编码 在通信和数据压缩领域具有重要的应用. 在介绍 Huffman 编码具体实现之前,先介绍几个相关的概念. 概念1:树中结点的带权路径长度 – 根结点到该结点的路径长度与该结点权 ...

  7. huffman java_详解Huffman编码算法之Java实现

    Huffman编码介绍 Huffman编码处理的是字符以及字符对应的二进制的编码配对问题,分为编码和解码,目的是压缩字符对应的二进制数据长度.我们知道字符存贮和传输的时候都是二进制的(计算机只认识0/ ...

  8. 采用Huffman编码进行数据压缩

    文章目录 问题 实验环境 程序组成 实现思路 如何用二进制0/1表示字符 '0' / '1' 源代码下载 程序运行和结果: 总结 问题 利用哈夫曼编码将英文文献进行压缩 注:哈夫曼算法及原理见博客ht ...

  9. Huffman编码(Huffman树)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...

最新文章

  1. php 两次post,ajax跨域往php程序post数据时,php程序总是执行两次的解决办法
  2. 强化学习(五)用时序差分法(TD)求解
  3. html搜索结果 重置,搜索结果和后退按钮/ HTML表格
  4. phpcms上传php,phpcms如何上传视频
  5. 用LVM快照创建虚拟机
  6. 寻路优化(一)——二维地图上A*启发函数的设计探索
  7. 基于netty搭建websocket,实现消息的主动推送
  8. intellij idea 12 搭建maven web项目 freemarker + spring mvc
  9. python语言-Python的语言特点
  10. 软件设计原则(二) 接口隔离原则
  11. 计算机主板详细维修,教你电脑主板维修必备基础知识
  12. 【财富空间】UpHonest Capital:美国人工智能投资分析报告(精华版)
  13. 【车牌识别】基于模板匹配算法实现新能源车牌识别matlab源码
  14. 网页打开微信/跳转微信
  15. MATLAB在图像上标记特定点
  16. 【苹果代发家庭推imessage】软件安装利用X代码iMessage Extensitioniments Sage SDK 1
  17. 在iOS中调用C语言的国密算法SM2以替换RSA
  18. 开发 Web 应用程序
  19. 判断是否是对象本身的属性(hasOwnProperty)
  20. Python 水果出库

热门文章

  1. python spyder安装错误分析
  2. sqlnbsp;tunningnbsp;advisor的使用
  3. sizeof的使用(指针和数组地址的区别)
  4. ST-GCN 复现:遇到多GPU并行训练时使用nn.DataParallel遇到的nn.ParameterList()为空的问题
  5. 网页大作业代码自取【HTML+CSS制作美味糖果网站】
  6. LiveGBS国标GB/T28181流媒体服务查看通道设备录像查看接入设备的前端录像
  7. C++——list的模拟实现
  8. vue2--基于zm-tree-org实现公司部门组织架构图
  9. 【c++】SPDLOG动态库和静态库、异步日志库hang 问题、registry核心类
  10. 新版Go2Shell 安装详解