22. 以「霍夫曼編碼」依據以下字母頻率表產生每個字母的二進位碼,以下各項敘述何者正確?
(A) 字母 A 編碼為 11
(B) 字母 B 編碼為 010
(C) 字母 C 編碼為 10
(D) 字母 E 編碼為 00
統計: A(7), B(46), C(10), D(19), E(0) #3233468
詳解 (共 3 筆)
根據霍夫曼編碼(Huffman Coding)的原理,我們應根據字元的頻率建構一棵二元樹。步驟如下:
- 將每個字元及其頻率視為一個節點。
- 將節點按頻率由小到大排序。
- 重複以下步驟,直到只剩一個節點為止:
- 取出頻率最小的兩個節點。
- 建立一個新的內部節點,其頻率為這兩個節點的頻率之和。
- 將這兩個節點作為新節點的子節點,並為連接邊賦值(通常左邊賦 0,右邊賦 1,或反之,但須保持一致)。
- 將這兩個節點從列表中移除,將新節點加入列表,並重新排序。
給定的字母頻率為: A: 17 B: 12 C: 12 D: 27 E: 32
按頻率由小到大排序:B(12), C(12), A(17), D(27), E(32)。
步驟 1: 合併頻率最小的 B(12) 和 C(12)。 建立一個新節點 (BC),頻率為 12 + 12 = 24。假設 B 是左子節點 (賦值 0),C 是右子節點 (賦值 1)。 節點列表及其頻率:A(17), (BC)24, D(27), E(32)。重新排序:A(17), (BC)24, D(27), E(32)。
步驟 2: 合併頻率最小的 A(17) 和 (BC)24。 建立一個新節點 (ABC),頻率為 17 + 24 = 41。假設 A 是左子節點 (賦值 0),(BC) 是右子節點 (賦值 1)。 節點列表及其頻率:D(27), E(32), (ABC)41。重新排序:D(27), E(32), (ABC)41。
步驟 3: 合併頻率最小的 D(27) 和 E(32)。 建立一個新節點 (DE),頻率為 27 + 32 = 59。假設 D 是左子節點 (賦值 0),E 是右子節點 (賦值 1)。 節點列表及其頻率:(ABC)41, (DE)59。重新排序:(ABC)41, (DE)59。
步驟 4: 合併 (ABC)41 和 (DE)59。 建立根節點,頻率為 41 + 59 = 100。假設 (ABC) 是左子節點 (賦值 0),(DE) 是右子節點 (賦值 1)。
建構出的霍夫曼樹結構 (左邊邊賦值 0,右邊邊賦值 1):
根據樹結構,從根節點到每個字母節點的路徑上的邊值連接起來,得到編碼:
- A: 00
- B: 010
- C: 011
- D: 10
- E: 11
現在比較這些編碼與選項: (A) 字母 A 編碼為 11:錯誤,計算結果為 00。 (B) 字母 B 編碼為 010:正確,計算結果為 010。 (C) 字母 C 編碼為 10:錯誤,計算結果為 011。 (D) 字母 E 編碼為 00:錯誤,計算結果為 11。
注意:在頻率相等(如 B 和 C 都是 12)或合併節點頻率相等時,將哪個節點放在左邊(賦 0)或右邊(賦 1)的規則可能會影響某些字元的具體編碼,但編碼長度和整體效率不受影響。這裡我們採用了標準的「小頻率放左邊,大頻率放右邊」以及「相同頻率按字母順序決定左右」並「左賦0右賦1」的慣例進行建構。在這種慣例下,選項 (B) 是正確的。
答案是 (B)。