python实现哈弗曼树进行数据压缩

#!/usr/bin/python
#Filename:readfile.py
codelist=[]
f=file('input.txt','r')
for line in f.readlines():
     line=line.strip('\n')
     codelist+=line.split(' ')
print codelist
###########################################
map={}
for i in codelist:
    if map.has_key(i)==False:
        map.setdefault(i,1)
    else:
        count=map.get(i)+1
        map[i]=count
print map
###########################################
#      sort map                           #
#      sort map                           #
###########################################
map=sorted(map.iteritems(),key=lambda asd:asd[1],reverse=True)
print map
list_map=list(map);
print list_map[0][1]
###############################################################
class HaffNode:
   def  __init__(self):
       self.weight=0
       self.flag=0
       self.parent=0
       self.leftChild=-1
       self.rightChild=-1
class Code:
    def __init__(self):
        self.code=""
        self.weight=0
        self.original_code=""
map_count=len(map)
node_list=list(range(map_count*2-1))
for i in node_list:
    temp=HaffNode()
    if i         temp.weight=list_map[i][1]
    node_list[i]=temp
for i in range(map_count-1):
    m1=m2=100000
    x1=x2=0
    for j in range(map_count+i):
        if node_list[j].weight             m2=m1
            x2=x1
            m1=node_list[j].weight
            x1=j
        elif node_list[j].weight             m2=node_list[j].weight
            x2=j
    node_list[x1].parent=map_count+i;
    node_list[x2].parent=map_count+i;
    node_list[x1].flag=1;
    node_list[x2].flag=1;
    node_list[map_count+i].weight=node_list[x1].weight+node_list[x2].weight
    node_list[map_count+i].leftChild=x1;
    node_list[map_count+i].rightChild=x2;
###################################################################
###################################################################
haffCode=list(range(map_count))
for i in range(map_count):
     k=0;f=0;temp_str="";
     k=i;f=node_list[k].parent;
     while f!=0:
          if node_list[f].leftChild==k:
               temp_str+='0'
               k=f;
               f=node_list[k].parent;
          elif node_list[f].rightChild==k:
               temp_str+='1'
               k=f
               f=node_list[k].parent
     haffCode[i]=Code()
     haffCode[i].code=temp_str[::-1]
     haffCode[i].weight=node_list[i].weight
     haffCode[i].original_code=list_map[i][0]
##################################################################
#       change the file                                          #
#################################################################3
changeCode={}
for i in haffCode:
     changeCode[i.original_code]=i.code;
print "changeCode",changeCode,"\n"
##################################################################
#              out put file                                      #
##################################################################
change_codelist=[]
for i in codelist:
     temp=changeCode[i]
     print "codelist",i,"changeCode",temp,'\n'
     change_codelist.append(temp)
print change_codelist,'\n'
print '############################################################'
print 'write to the file'
f=file('output.txt','w')
for i in change_codelist:
     f.write(i)
     f.write('\t')
f.close()

print "Done ,over!"

input.txt

0010 0100 0010 0110 0000 0010 1011 0100 0010 0100 0110 0010
0010 0100 0010 0110 0000 0110 0010 0100 0110 0010 0010 0000
0010 0110 0010 0010 0010 0100 0100 0110 0010 0010 1000 0101
0001 0100 0010 0111 0010 0010 0111 0111 0100 0100 1000 0101
1100 0100 0100 0111 0010 0010 0111 1101 0010 0100 1111 0011

output.txt

11 01 11 100 0011 11 00101 01 11 01 100 11 11 01 11 100 0011 100 11 01 100 11 11 0011 11 100 11 11 11 01 01 100 11 1110101 10100 101100 01 11 000 11 11 000 000 01 01 10101 10100 101111 01 01 000 11 11 000 00100 11 01 101110 101101

你可能感兴趣的:(Python)