本文实例讲述了Python数据结构之哈夫曼树定义与使用方法。分享给大家供大家参考,具体如下:
HaffMan.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#coding=utf-8
#考虑权值的haff曼树查找效率并非最高,但可以用于编码等使用场景下
class TreeNode:
def __init__( self ,data):
self .data = data
self .left = None
self .right = None
self .parent = None
class HaffTree:
def __init__( self ):
self .root = None
def set_root( self ,rootNode):
self .root = rootNode
def run( self ,lis):
i = 0
lis = [[lis[j][ 0 ],lis[j][ 1 ],TreeNode(lis[j][ 1 ])] for j in range ( len (lis))]
while len (lis)> 1 :
i + = 1
lis = sorted (lis)
name = 'N' + str (i)
temp = TreeNode(name)
#结果与大话数据结构书上略有不同 因为lis[0][2]=lis[1][2] 无影响
#这里使用parent 替代深度优先/广度优先 算法
temp.left = lis[ 0 ][ 2 ]
temp.right = lis[ 1 ][ 2 ]
lis[ 0 ][ 2 ].parent = temp
lis[ 1 ][ 2 ].parent = temp
#print lis[0][0],lis[1][0],len(lis)
value = lis[ 0 ][ 0 ] + lis[ 1 ][ 0 ]
lis = lis[ 1 :]
lis[ 0 ] = [value,name,temp]
#print temp.data,temp.left.data,temp.right.data
self .set_root(temp)
def code( self ,lis):
self .codeList = []
stack = []
Node = self .root
stack.append(Node)
res = []
while (stack):
node = stack.pop()
res.append(node)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
for li in lis:
codeL = []
for re in res:
if re.data = = li[ 1 ]:
parent = re
print '\n' ,parent.data,
codeL.append(parent)
while parent.parent:
parent = parent.parent
print parent.data,
codeL.append(parent)
codeLL = [ int (codeL[ len (codeL) - 2 - i] = = codeL[ len (codeL) - 1 - i].right) for i in range ( len (codeL) - 1 )]
self .codeList.append([li[ 1 ],codeLL])
return self .codeList
def list_all( self ,method):
lis = []
res = []
if method = = 'before' :
Node = self .root
lis.append(Node)
while (lis):
node = lis[ - 1 ]
lis = lis[: - 1 ]
if node:
res.append(node.data)
if node.right:
lis.append(node.right)
if node.left:
lis.append(node.left)
elif method = = 'mid' :
node = self .root
while lis or node:
while node:
lis.append(node)
node = node.left
if len (lis)> 0 :
node = lis[ - 1 ]
lis = lis[: - 1 ]
if node:
res.append(node.data)
node = node.right
else :
pass
return res
|
HaffMantest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#coding=utf-8
from HaffMan import HaffTree
tree = HaffTree()
lis = [
[ 5 , 'A' ],
[ 15 , 'B' ],
[ 40 , 'C' ],
[ 30 , 'D' ],
[ 10 , 'E' ],
]
print lis[ 2 :]
print sorted (lis)
tree.run(lis)
print tree.list_all( 'before' )
#应用 HaffMan编码,比如字母分布不均匀的情况下比较适合,可减少传输的信息量(二进制),不会出现干涉。:
tree = HaffTree()
lis2 = [
[ 27 , 'A' ],
[ 8 , 'B' ],
[ 15 , 'C' ],
[ 15 , 'D' ],
[ 30 , 'E' ],
[ 5 , 'F' ],
]
tree.run(lis2)
print tree.code(lis2)
|
运行结果:
希望本文所述对大家Python程序设计有所帮助。
原文链接:https://blog.csdn.net/sinat_33829806/article/details/78477076