霍夫曼编码

原创 2015年11月18日 10:08:14

Description
对输入的英文大写字母序列进行统计概率,然后构建Huffman树,输出按照概率降序排序输出Huffman编码。
 
Input

第一行是大写字母个数n(0<n<=100)

第二行为n个字母,中间以一个空格分隔。
 
Output

假设输入中共有m个不同的字母,按照出现概率降序输出,每个字母单独一行输出。格式如下:

字母1 出现次数 Huffman编码
字母2 出现次数 Huffman编码
字母3 出现次数 Huffman编码
字母m 出现次数 Huffman编码
 
Sample Input
Copy sample input to clipboard
10
S S U U U S U L U U
Sample Output
U 6 1
S 3 01
L 1 00

题目分析

构造哈夫曼树非常简单,每次将所有节点排序,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到只剩一个节点(树根)。
注意使被替换节点中频率低的为左孩子,高者为右孩子

为了适应题目需求,定义了如下结构体
struct Node {
  int value;    // 记录频率
  char c;       // 记录字符
  std::string code;   // 记录编码
  Node* l;            // 左孩子
  Node* r;            // 右孩子
  Node(int num, int index) { };   //num为频率, index用来确定是那个字符
} *nodes[26];
在按照上面方法构造哈夫曼树的时候,同时将所有的叶子节点(左右孩子为NULL)按频率从低到高(左孩子先入栈)入栈
当只剩下一个节点时,从上到下确定每个节点的编码
if (root->l != NULL) {
  root->l->code = root->code + "0";
  dfs(root->l);
}同理确定右孩子的编码
最后按要求输出栈内节点的值

#include <iostream>
#include <stack>
#include <algorithm>
#include <memory.h>

struct Node {
  int value;
  char c;
  std::string code;
  Node* l;
  Node* r;
  Node(int num, int index) {
    value = num;
    c = 'A' + index;
    code = "";
    l = r = NULL;
  }
} *nodes[26];

bool com(Node* a, Node* b) {
  return a->value > b->value;
}

void dfs(Node* root) {
  if (root->l != NULL) {
    root->l->code = root->code + "0";
    dfs(root->l);
  }
  if (root->r != NULL) {
    root->r->code = root->code + "1";
    dfs(root->r);
  }
}

int main()
{
  int num;
  std::cin >> num;
  int arr[26];
  memset(arr, 0, sizeof(arr));
  char temp;
  int count = 0;
  for (int i = 0; i < num; ++i) {
    std::cin >> temp;
    if (arr[temp-'A'] == 0)
      count++;
    arr[temp-'A']++;
  }
//std::cout << count << std::endl;
  int index = 0;
  for (int i = 0; i < 26; ++i) {
    if (arr[i] > 0) {
      nodes[index++] = new Node(arr[i], i);
    }
  }

  std::stack<Node*> s;
  while (count != 1) {
    std::sort(nodes, nodes+count, com);
    if (nodes[count-1]->l == NULL && nodes[count-1]->r == NULL)
      s.push(nodes[count-1]);
    if (nodes[count-2]->l == NULL && nodes[count-2]->r == NULL)
      s.push(nodes[count-2]);
    Node* father = new Node(nodes[count-1]->value + nodes[count-2]->value, 0);
    father->l = nodes[count-1];
    father->r = nodes[count-2];
    nodes[count-2] = father;
    count--;
  }
//std::cout << count << std::endl;
  dfs(nodes[0]);
//std::cout << "coding end" << std::endl;
  while (!s.empty()) {
    std::cout << s.top()->c << " " << s.top()->value << " " << s.top()->code << std::endl;
    s.pop();
  }
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

哈夫曼树编码

对输入的英文大写字母进行统计概率 然后构建哈夫曼树,输出是按照概率降序排序输出Huffman编码 输入   大写字母个数 n 第一个字母 第二个字母 第三个字母 ... 第n个字母 输出  字母...
  • EliminatedAcmer
  • EliminatedAcmer
  • 2017年11月02日 19:44
  • 186

霍夫曼树和霍夫曼编码原理

一、哈夫曼树的概念和定义   什么是哈夫曼树? 让我们先举一个例子。 判定树:         在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例...
  • sddxqlrjxr
  • sddxqlrjxr
  • 2016年04月10日 20:20
  • 9934

Huffman树及其应用

最优二叉树(赫夫曼树)                 路    径:由一结点到另一结点间的分支所构成。         路径长度:路径上的分支数目。a→e的路径长度=2         树...
  • qq_28602957
  • qq_28602957
  • 2016年06月01日 10:56
  • 2102

【数据结构】Huffman编码

基础知识         目前,进行快速的远距离通信的主要手段是电报,即将需传送的信息转换成由二进制字符组成的字符串。例如,需传送的信息为“ABACCDA”,它只有四个字符,只需要两个字符的串便可以进...
  • tmylzq187
  • tmylzq187
  • 2014年12月02日 13:49
  • 2674

数字视频编码概述(熵编码/Huffman编码)

1. 数字视频压缩的必要性和可能性 按ITU-R BT. 601建议,数字化后的输入图像格式为720*576像素,帧频为25帧/s,采样格式为4:2:2,量化精度为8bit, 则数码率:(72...
  • u013354805
  • u013354805
  • 2015年11月30日 16:18
  • 2084

霍夫曼编码(Huffman Coding)

霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种。 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符...
  • xgf415
  • xgf415
  • 2016年09月22日 21:44
  • 22087

java编程题:输入一段英文,获取每个单词出现的次数跟位置,并排序

给定的英文片段:If someone loves a flower, of which just one single blossom grows in all the millions and mi...
  • MakeYourChance
  • MakeYourChance
  • 2017年02月19日 21:05
  • 898

Huffman编码文件压缩 - Huffman树的建立与编码

【问题描述】 编写一程序采用Huffman编码对一个正文文件进行压缩。具体压缩方法如下: 1.    对正文文件中字符(换行字符'\'除外,不统计)按出现次数(即频率)进行统计 2.    依据字符频...
  • Jason_Ranger
  • Jason_Ranger
  • 2016年05月20日 11:09
  • 1750

C++实现Huffman的编解码

Huffman用C++进行编解码的实现
  • u013065237
  • u013065237
  • 2017年04月25日 06:00
  • 227

huffman(哈夫曼)树的实现

哈夫曼树的实现 概念: 哈夫曼(Huffman)树又称最优二叉树或最优搜索树,是一种带权路径长度最短的二叉树。在许多应用中,常常赋给树中结点一个有某种意义的实数,称此实数为该结点的权。从树根结点到该...
  • curson_
  • curson_
  • 2016年12月21日 00:12
  • 416
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:霍夫曼编码
举报原因:
原因补充:

(最多只允许输入30个字)