众所周知,有一种最坏情况的最优算法来计算时间为的霍夫曼码。通过两种正交方式对此进行了改进:
如果不同频率的集合较小(例如,大小为),则可以更快地计算出最佳的无前缀代码:使用[Munro and Spira,1976]对频率进行排序,以便利用σ的较小值,并计算Huffman频率排序后的线性时间中的树。这产生在溶液Ö (Ñ LG σ )
有一种算法可以计算等效代码,其中k是不同代码字长度的数量 [Belal and Elmasry]。
THE源于2006年STACS似乎是错的,Elmasry在2010年出版的arXiv(http://arxiv.org/abs/cs/0509015)版本宣布-上无序的输入操作,并- 对排序的输入执行操作
我看到了一个类似于计算平面凸包的复杂性的类比,其中(基于排序,作为霍夫曼代码的算法)和(礼物在被Kirkpatrick和Seidel的算法所取代(后来证明是实例最优的,其复杂度为)。对于无前缀代码,与表示算法可能具有复杂度,甚至,其中是长度的代码字数使用覆盖的凸包的边缘的类比,指向覆盖符号的代码长度。
一个简单的示例显示,对频率的(四舍五入)对数值进行排序(在字RAM模型中以线性时间排序)并不能在线性时间内给出最佳的无前缀代码:
- 对于,和
- 因此日志排序不会更改顺序
- 然而,三分之二的代码比最佳代码要花费位。
另一个有趣的问题是当大时降低复杂度,即所有代码都有不同的长度:
- 例如,当,频率都是不同的对数值。在这种情况下,可以在字RAM中以线性时间对频率进行排序,并以线性时间计算霍夫曼代码(因为对它们的对数值进行排序就足以对值进行排序),从而得出整体线性时间,比Belal和Elmasry的算法中的好得多。