12.27

数据结构作业
第一问:给出每个字符的哈夫曼编码
字符和频率:

a: 0.03
b: 0.35
c: 0.13
d: 0.15
e: 0.20
f: 0.05
g: 0.09

按频率从小到大排序(相同频时字符顺序任意,但按题给规则左 ≤ 右):
a(0.03), f(0.05), g(0.09), c(0.13), d(0.15), e(0.20), b(0.35)

步骤 1:a=0.03, f=0.05 → 合并 0.08
新序列:g(0.09), 0.08, c(0.13), d(0.15), e(0.20), b(0.35)

步骤 2:g=0.09, 0.08 → 合并 0.17(左支是 0.08,右支 0.09 因为左≤右)
新序列:c(0.13), d(0.15), 0.17, e(0.20), b(0.35)

步骤 3:c=0.13, d=0.15 → 合并 0.28
新序列:0.17, e(0.20), 0.28, b(0.35)

步骤 4:0.17, e=0.20 → 合并 0.37(左 0.17 ≤ 右 0.20)
新序列:0.28, 0.37, b(0.35) → 排序:0.28, b(0.35), 0.37

步骤 5:0.28, b=0.35 → 合并 0.63(左 0.28 ≤ 右 0.35)
新序列:0.37, 0.63

步骤 6:0.37, 0.63 → 合并 1.0

构建树(详细合并记录以便编码):
合并顺序:

a(0.03)+f(0.05) → [0.08]
左 a,右 f

g(0.09)+[0.08] → [0.17]
左 [0.08] (a,f),右 g

c(0.13)+d(0.15) → [0.28]
左 c,右 d

[0.17]+e(0.20) → [0.37]
左 [0.17],右 e

[0.28]+b(0.35) → [0.63]
左 [0.28],右 b

[0.37]+[0.63] → [1.0]
左 [0.37],右 [0.63]

从根 [1.0] 开始,向下编码(左 0,右 1):

左分支到 [0.37]:代码先加 0

到 [0.17]:再加 0

到 [0.08]:再加 0

到 a:0000

到 f:0001

到 g:01(在 [0.17] 右)

到 e:10(在 [0.37] 右)

右分支到 [0.63]:代码先加 1

到 [0.28]:再加 0

到 c:010(此处小心,注意前面分支的命名!我们重新画一下)

画树逻辑重走(确保编码正确):

最终结构(括号内为原始字符或合并节点,> 左小右大):

(a,f) = 0.08

(0.08, g) = 0.17

(c,d) = 0.28

(0.17, e) = 0.37

(0.28, b) = 0.63

(0.37, 0.63) = 1.0

posted @ 2025-12-27 23:47  山蚯  阅读(4)  评论(0)    收藏  举报