当前位置: 首页 > 知识库问答 >
问题:

近似保序霍夫曼码

山越
2023-03-14

我正在为算法和数据结构课做作业。我很难理解给出的说明。我会尽力解释这个问题。

我得到的输入是一个正整数 n,后跟 n 个正整数,表示有序字符集中符号的频率(或权重)。第一个目标是构造一个树,为有序字符集的每个字符提供近似的顺序保持霍夫曼代码。我们要通过“贪婪地合并权重最小的两棵相邻树”来实现这一点。

在赋值中,我们看到传统的霍夫曼代码树是通过将权重首先插入到优先级队列中来构造的。然后通过使用 delmin() 函数从优先级队列中“弹出”根,我可以获取频率最低的两个节点并将它们合并为一个节点,其左右是这两个频率最低的节点,其优先级是其子节点的优先级之和。然后,此合并节点将重新插入到最小堆中。重复该过程,直到所有输入节点都已合并。我使用大小为 2*n*-1 的数组实现了这一点,输入节点从 0...n-1 开始,然后从 n...2*n*-1 是合并的节点。

我不明白我怎么能贪婪地合并权重最小的两棵相邻树。我的输入基本上被组织成一个最小堆,从那里我必须找到两个总和最小的相邻节点并合并它们。通过相邻,我假设我的教授意味着它们在输入中彼此相邻。

输入示例:

9
1
2
3
3
2
1
1
2
3

然后我的最小堆将如下所示:

               1
          /         \
        2            1 
     /     \        /  \
    2       2      3    1
   /  \
  3    3 

具有最小总和的两个相邻的树(或节点)是出现在输入末尾附近的两个连续的1。我可以应用什么逻辑从这些节点入手?我似乎错过了一些东西,但我不能完全掌握它。如果你需要更多的信息,请告诉我。如果有不清楚的地方,我可以详细说明或者提供整个作业页面。

共有2个答案

齐鹏程
2023-03-14

你需要弹出两棵树并制作第三棵树。向它左边的节点加入树,用较小的总和,向右的节点加入第二棵树。把这棵树堆起来。从您的示例

从堆中弹出2棵树:

1 1

使树

  ?
 / \
?   ?

将较小的树放在左侧节点

min(1, 1) = 1

  ?
 / \
1   ?

放在右节点第二棵树

  ?
 / \
1   1

你做的树有sum =左节点和右节点和

  2
 / \
1   1

将新树(总和 2)放入堆中。

最后你会有一棵树,它是霍夫曼树。

拓拔稳
2023-03-14

我认为这可以通过对传统算法的小修改来完成。与其在优先级队列堆中存储单个树,不如存储相邻树对。然后,在每一步中,您都删除最小对(t1, t2)以及最多两对也包含这些树的对,即(u, t1)(t2, r)。然后将t1t2合并到新树t'中,用更新的权重在堆中重新插入对(u, t')(t', r)并重复。

 类似资料:
  • 本文向大家介绍霍夫曼编码算法,包括了霍夫曼编码算法的使用技巧和注意事项,需要的朋友参考一下 霍夫曼编码是一种无损数据压缩算法。在该算法中,分配了可变长度代码以输入不同的字符。代码长度与字符使用频率有关。最常见的字符具有最小的代码,较长的代码具有最不频繁的字符。 主要有两个部分。第一个创建霍夫曼树,另一个遍历该树以查找代码。 例如,考虑一些字符串“ YYYZXXYYX”,字符Y的频率大于X,字符Z的

  • 我正在尝试创建一个正确的霍夫曼树,并想知道这是否正确。顶部数字是频率/权重,底部数字是 ASCII 代码。字符串是“hhiiiissssss”。如果我将其输入到文本文件中,则只有一个 LF 正确吗?我不确定为什么我的程序是两读的。

  • 我试图压缩一个24位的值。但我之前没有任何压缩方面的经验。所以,我想知道是否有人可以给我一些见解或建议,如何编码和解码的24位值使用verilog或matlab。 问题:我将24位值分成6块4位。每个4位在哈夫曼树中都有一个唯一的路径。我按照这棵树查找压缩值,但我在如何解码这些值上遇到了障碍。由于树是静态的,解码器将知道它。但是,当解码器获得比特流时,它怎么知道如何解码呢。 附上一张图片来阐明我在

  • 我正在尝试在python中生成霍夫曼代码树的有序和预序遍历。不过,我似乎碰壁了。我需要生成遍历并将它们写入相应的文件,然后创建指向每个节点位置的二进制路径并将其输出到文件中。这是我到目前为止所拥有的

  • 赫夫曼树 路径和路径长度:表示树从根节点开始到达节点经过的次数,若一颗树根节点为1层,那么第K层的树的路径的长度为K-1 权: 赋予每一个节点上面特定的权重值 带权路径:带权路径等于节点的权与路径长度的乘积,为带权路径 = 权 * 路径长度 树的带权路径长度:为所有叶子节点的带权路径之和记做WPL(weight path length) 赫夫曼树huffman-tree或哈夫曼树,又称最优二叉树,

  • 我能找到的所有霍夫曼编码示例都有偶数个字符可以使用。如果是奇数个字符,添加到树中的最后一个内部节点可以只有一个子节点吗?还是我必须添加某种NULL节点,以便所有内部节点都只有两个子节点? 如果是后者,这似乎令人困惑,因为我不确定如何为char设置NULL值(因为所有值都被用作有效的ASCII代码)。