反向霍夫曼的算法?

时间:2017-10-07 01:14:54

标签: algorithm huffman-code greedy

我有一个类似于霍夫曼编码的问题,我不确定它是如何解决的,或者它是否是反向霍夫曼的编码。但它肯定可以用贪婪的方法来解决。

考虑一组长度,每个长度与概率相关联。即

X={a1=(100,1/4),a2=(500,1/4),a3=(200,1/2)}

显然,所有概率的总和= 1。

从起点一个接一个地将长度排列在一条线上。

例如:从开始到结束的顺序为{a2,a1,a3}

将元素a_i的成本定义为从该元素的起始行到结尾的总长度乘以其概率。

从以前的安排来看:

cost(a2) = (500)*(1/4)
cost(a1) = (500+100)*(1/4)
cost(a3) = (500+100+200)*(1/2)

将总费用定义为所有费用的总和。例如cost(X) = cost(a2) + cost(a1) + cost(a3)。给出一种算法,找到最小化cost(X)

的排列

我试过形成一些替代的霍夫曼树,但它不起作用。

按概率排序将失败(考虑X = {(100,0.4),(300,0.6)})。

按长度排序也会失败(考虑X = {(100,0.1),(300,0.9)})。

如果有人可以帮助或提示最佳解决方案算法,那就太棒了。

1 个答案:

答案 0 :(得分:2)

考虑如果交换两个相邻元素会发生什么。两个元素之前和之后的计算是相同的,所以它只取决于两个元素。

单独采用两个元件,成本为P1L1 + P2(L1 + L2)和P2L2 + P1(L1 + L2)。如果你减去这个并简化我是否有正确的代数你想要在L1 / P1< 1时将1交换到第一个。 L2 / P2。检查 - 当L1 = 0时,这至少得到正确的答案。

所以我认为你想要将元素按照递增的Li / Pi顺序排序,因为如果不是这样的话,你可以通过交换相邻元素来改进答案。