Im Moment habe ich diesen Algorithmus Huffman in LuaHerstellung Huffman effizienter
for _,v in next, tData do
tFreq[v] = tFreq[v] and tFreq[v]+1 or 1
end
for k,v in next,tFreq do
iCount = iCount + 1
fInsert(tTree,{freq=v,contains=k})
end
while #tTree>1 do
fSort(tTree, function(a,b)
return a.freq<b.freq
end)
fInsert(tTree,{freq=tTree[1].freq+tTree[2].freq,contains={tTree[1],tTree[2]}})
fRemove(tTree,1)
fRemove(tTree,1)
end
iMaxSize, tKey = fSetBits(tTree[1])
die Funktion fSetBits ist dieses
local function fSetBits(tData, sCurrBit, sThisBit, bInternal)
local iMaxBit, iPossBit, tSet
sCurrBit = sCurrBit or ""
sThisBit = sThisBit or "0"
local tSolution = {}
if type(tData.contains)=="table" then
iMaxBit,tSet = fSetBits(tData.contains[1],sCurrBit..(bInternal and sThisBit or ""),1,true)
for k,v in next,tSet do
tSolution[k] = v
end
iPossMax,tSet = fSetBits(tData.contains[2],sCurrBit..(bInternal and sThisBit or ""),0,true)
iMaxBit = iMaxBit>iPossMax and iMaxBit or iPossMax
for k,v in next,tSet do
tSolution[k] = v
end
else
tSolution[tData.contains]=sCurrBit..sThisBit
iMaxBit = #sCurrBit+1
end
return iMaxBit, tSolution
end
Mein größtes Problem ist, dass Codes schnell größer als 8 Bits werden und beim Lesen der Schlüsseltabelle Ich kann Codes sehen, die leicht gekürzt oder neu angeordnet werden können, während die No-Präfix-Regel beibehalten wird. Gibt es eine bessere Möglichkeit, die Bitcodes aus dem Huffman-Baum zu erstellen, die zu etwas Dekodierbarem führen, aber auch viel effizienter?
Alle möglichen Huffman-Bäume haben gleiche Effizienz in Bezug auf das Kompressionsverhältnis. Aber sie können unterschiedliche Baumtiefen haben. Um die Baumtiefe zu reduzieren, sollten Sie die Teilbaumtiefe berücksichtigen, während Sie zwei zusammenfügbare Teilbäume in 'fSort (tTree, ...)' auswählen. Trotzdem sollten Sie in der Lage sein, mit Tiefenbäumen> 8 zu arbeiten, um einen echten Huffman-Encoder zu erhalten. Welche Schwierigkeiten haben Sie bei der Arbeit mit Huffman-Codes länger als 8 Bit? –