我有一个类似于霍夫曼编码的问题,我不确定它是如何解决的,或者它是否是反向霍夫曼的编码。但它肯定可以用贪婪的方法来解决。
考虑一组长度,每个长度与概率相关联。即
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)})。
如果有人可以帮助或提示最佳解决方案算法,那就太棒了。
答案 0 :(得分:2)
考虑如果交换两个相邻元素会发生什么。两个元素之前和之后的计算是相同的,所以它只取决于两个元素。
单独采用两个元件,成本为P1L1 + P2(L1 + L2)和P2L2 + P1(L1 + L2)。如果你减去这个并简化我是否有正确的代数你想要在L1 / P1< 1时将1交换到第一个。 L2 / P2。检查 - 当L1 = 0时,这至少得到正确的答案。
所以我认为你想要将元素按照递增的Li / Pi顺序排序,因为如果不是这样的话,你可以通过交换相邻元素来改进答案。