哈夫曼树
在实际生活中,要将学生成绩划分为5个等级。而每个分数段的学生占比不同。
分数 | 0~59 | 60-69 | 70~79 | 80~89 | 90~100 |
---|---|---|---|---|---|
等级 | 不及格 | 及格 | 中等 | 良好 | 优秀 |
代号 | E | D | C | B | A |
占比 | 5% | 15% | 40% | 30% | 10% |
如果按照一般的判断方法如下代码,每次都从60开始比较,而大于70分的成绩占比80%,显然不合理。
def scale(score):
if score < 60:
result = "E" # 不及格
elif score < 70:
result = "D" # 及格
elif score < 80:
result = "C" # 中等
elif score < 90:
result = "B" # 良好
else:
result = "A" # 优秀
return result
哈夫曼:“从树中一个节点到另外一个节点之间的分支构成两个节点之间的路径,路径上的分支数目称作路径长度。”上图中根节点到B的路径长度为4.此二叉树路径的长度就为:1+1+2+2+3+3+4+4 = 20.WPL = 5x1+15x2+40x3+30x4+10x4=315
带权路径长度WPL最小的二叉树叫哈夫曼树。
生成哈夫曼树步骤:1)想把叶子节点按照从小到大的顺序排列成一个有序序列,E5%,A10%,D15%,B30%,C40%;
2)取前头权值最小的两个作为节点N1的叶子,小的作为左孩子,相对大的为右孩子。
3)再将N15%与剩下的节点排序,重复第二步。构成哈夫曼树。
此时,WPL=40x1+30x2+15x3+10x4+5x4=205
哈夫曼编码
设置编码集合为{d1,d2,d3,d4,d5}
由哈夫曼树构成哈夫曼编码如下:
每个子树的左分支设为0,右分支设为1.
有编码集{0,11,101,1001,1000}
以上为简单的哈夫曼编码示例。