題目連結:
給定一正整數 n (n ≦ 2 ^ 16),代表有 n 個符號。接著的一列給定 n 個正整數(值介於 1 ~ 65536 之間),代表各個符號的出現頻率。
現在以霍夫曼編碼(Huffman Coding,見
維基),求最後編碼後的位元數(編碼後的密文長度)為多少?
因為有霍夫曼編碼,所以可以參考
以前的文章。只是在取兩個最小數相加後所產生的新節點,需要指回原先的兩個最小數(以便回溯)。
做完編碼後,遞迴探訪到葉節點(此時即為最初儲存字元頻率的節點),算出每個葉節點的頻率 × 此葉節點所在之樹深度(從根節點為 0 開始算)。最後之總和即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。