C 近似保序哈夫曼码

C 近似保序哈夫曼码,c,algorithm,priority-queue,huffman-code,min-heap,C,Algorithm,Priority Queue,Huffman Code,Min Heap,我正在为算法和数据结构课程做作业。我很难理解给出的说明。我会尽力解释这个问题 给定的输入是一个正整数n,后跟n个正整数,表示有序字符集中符号的频率(或权重)。第一个目标是构造一棵树,为有序字符集的每个字符提供一个近似的保序哈夫曼码。我们要通过“贪婪地合并两棵权重之和最小的相邻树”来实现这一点 在分配中,我们证明了传统的哈夫曼码树是通过首先将权值插入优先级队列来构造的。然后,通过使用delmin()函数从优先级队列中“弹出”根,我可以获得频率最低的两个节点,并将它们合并为一个节点,其左侧和右侧是这

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

给定的输入是一个正整数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个树:

11

造树

  ?
 / \
?   ?
将较小的树放到左侧节点

min(1, 1) = 1

  ?
 / \
1   ?
放置到第二棵树的右节点

  ?
 / \
1   1
您创建的树的总和=左节点的总和+右节点的总和

  2
 / \
1   1
将新树(总和2)放入堆中


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

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

没有意识到我需要给作业贴标签。刚刚发现。