当频率相似时,计算最佳无前缀码的复杂度是多少?


13

众所周知,有一种最坏情况的最优算法来计算时间为的霍夫曼码θ(nlgn)。通过两种正交方式对此进行了改进:

  1. 如果不同频率的集合较小(例如,大小为),则可以更快地计算出最佳的无前缀代码:使用[Munro and Spira,1976]对频率进行排序,以便利用σ的较小值,并计算Huffman频率排序后的线性时间中的树。这产生在溶液Ö Ñ LG σ σσO(nlgσ)

  2. 有一种算法可以计算等效代码,其中k不同代码字长度数量 [Belal and Elmasry]。O(n16k)k

O(nmin{16k,lgσ})


THE源于2006年STACS似乎是错的O(nk),Elmasry在2010年出版的arXiv(http://arxiv.org/abs/cs/0509015)版本宣布-上无序的输入操作,并- 对排序的输入执行操作O(16kn)O(9klog2k1n)


  1. 我看到了一个类似于计算平面凸包的复杂性的类比,其中(基于排序,作为霍夫曼代码的算法)和(礼物在被Kirkpatrick和Seidel的算法所取代(后来证明是实例最优的,其复杂度为)。对于无前缀代码,与表示算法可能具有复杂度,甚至,其中是长度的代码字数O(nlgn)O(nlgn)O(nh)O(nlgh)O(nH(n1,,nk)O(nlgn)O(nk)O(nlgk)O(nH(n1,,nk)nii使用覆盖的凸包的边缘的类比,指向覆盖符号的代码长度。nini

  2. 一个简单的示例显示,对频率的(四舍五入)对数值进行排序(在字RAM模型中以线性时间排序)并不能在线性时间内给出最佳的无前缀代码: θ(lgn)

    • 对于,和n=3f1=1/2εf2=f3=1/4+ε
    • lgfi=2因此日志排序不会更改顺序
    • 然而,三分之二的代码比最佳代码要花费位。n/4
  3. 另一个有趣的问题是当大时降低复杂度,即所有代码都有不同的长度:k

    • 例如,当,频率都是不同的对数值。在这种情况下,可以在字RAM中以线性时间对频率进行排序,并以线性时间计算霍夫曼代码(因为对它们的对数值进行排序就足以对值进行排序),从而得出整体线性时间,比Belal和Elmasry的算法中的好得多。k=nθ(lgn)n2

Answers:


1

花了几年时间(五年!),但这是该问题的部分答案:

http://arxiv.org/abs/1602.00023

带有部分排序的最佳前缀免费代码JérémyBarbay(2016年1月29日提交)

我们描述了一种算法,该算法在O(n(1 +lgα))⊆O(nlgn)内计算n个未排序的正权重的最优无前缀代码,其中交变α∈[1..n-1]测量计算所需的排序。在代数决策树计算模型中,在最坏的情况下,对于大小为n且交替为α的所有实例,这种渐近复杂性都处于最优常数之内。这样的结果通过仅组合van Leeuwen算法来计算最优前缀来优化最坏情况下Θ(nlgn)的复杂度,而在同一计算模型中大小为n的实例(自1952年以来的压缩和编码里程碑)从排序的权重中释放代码(自1976年以来为人所知),并使用Deferred Data Structures对其进行查询来对多集进行部分排序(自1988年以来为人所知)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.