哈夫曼编码
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。—-百度百科
哈夫曼编码性质
- 哈夫曼编码是前缀编码,因为没有一片叶子是另一片叶子的祖先,所以就不可能是其他编码的前缀
- 哈夫曼编码是最优前缀编码,因为哈夫曼树的带权路径长度最短,古字符编码总长最短
创建哈夫曼编码算法实现
--创建哈夫曼编码算法
--array - 哈夫曼树数组,n - 叶子结点数量
--[[
哈夫曼树数组结构:
array.weight = 0--权重值
array.lch = 0--左孩子(数组中的下标)
array.rch = 0--右孩子(数组中的下标)
array.parent = 0--双亲(数组中的下标)
]]
function HuffmanTree:CreatHuffmanCode(array, n)
--哈夫曼编码
local huffmanCodeCode = ""
--从叶子到跟逆向求每个字符的哈夫曼编码,存储在huffmanCodeCode中
for i = 1, n do
local chart = ""--临时存储单个编码字符
local c = i--开始叶子下标
local parent= array[i].parent
--从叶子结点开始向上回溯,直到根结点
while f ~= 0 do
if array[parent].lch == c then chart = "0" .. chart--左孩子
else chart = "1" .. chart end --右孩子
--继续向上回溯
c = parent
f = array[parent].parent
end
huffmanCodeCode = huffmanCodeCode .. chart
end
return huffmanCodeCode
end
构造哈夫曼树数组算法请查看:
【Lua】哈夫曼树构造算法分析