【问题标题】:Create Huffman Code Tree from min-heap C++从最小堆 C++ 创建 Huffman 代码树
【发布时间】:2015-11-13 08:01:00
【问题描述】:

假设您有一个 C++ 程序,它必须从给定的 .txt 文件中读取文本。该计划将:

  • 计算文件中每个字符的出现次数,然后将每个唯一字符(及其频率)存储为一个新的树节点
  • 然后程序会构建一个包含这些节点的最小堆,然后使用这个最小堆构建 Huffman 代码树。
  • 遍历(前序和有序)将被写入输出文件。树的每个内部节点都有标签 I:xxx,其中 xxx 是 int 标签,叶子有 L:xxx
  • 程序最终构建了一个表,其中包含存储为字符串的每个字符的编码(基于 ASCII,不是真正的 .bin 版本)

我想我会像这样将每个节点存储在一个霍夫曼类中:

struct CharNode {

      char value;
      int frequency;
      bool internal;
      int label;
      CharNode *parent;
      CharNode *left_child;
      CharNode *right_child;
};

我不确定从哪里开始。任何帮助将不胜感激!

【问题讨论】:

  • 第一步是读取 .txt 文件。祝你好运。

标签: c++ decoding huffman-code min-heap


【解决方案1】:

首先使用一个数组,该数组的长度足以让您的应用程序可以识别的每个字符都有一个元素。现在遍历字符串,增加对应于它们的 ASCII 值的数组元素。 (您可能需要减去初始 ASCII 值的某个基数,因此您开始计算 'a' 的第一个数组元素)

这部分也可以在 C 中相当容易地完成,因为它使用字符和整数作为等价物。

完成后,您将获得所有字符及其出现次数。现在,一旦开始构建树节点,您就可以遍历数组。并在那棵树上使用你的堆算法。

或者只是对数组进行排序,然后从那里开始构建你的树。

祝你好运,编码愉快:)

【讨论】:

  • 我很困惑如何从这个数组构建一个最小堆,以及它如何转化为一个霍夫曼树:(
  • 从每个数组元素中创建一个节点,并将其放入按出现次数排序的结构中。创建一个新节点,将两个较小的节点设为其子节点,并将该节点的数量设置为其两个子节点的总和。从结构中删除子节点,重新插入这个新节点,再次排序并重复,直到只剩下一个节点。它将/应该是你的霍夫曼树的根
猜你喜欢
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多