免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1795 | 回复: 0
打印 上一主题 下一主题

Huffman 树的编码和解码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-07 01:25 |只看该作者 |倒序浏览
     今天终于搞定了,Huffman树的编码和解码,不过现在还有一个问题,就是还没有把它放到字节中去,还是一个字符一个字符的存储的,不过感觉还是有进步的,作出来了,心里还是比较高兴的,不是这些天我不来写,而是我真的上不来了,本来速度就很慢,现在不用代理就上不了,所以只有晚上很晚才能登上来看看,现在时间真的是很紧张.
     下面是Huffman编码的代码,我用python写的,python用起来还是比较简单的,比C++方便很多,实现比较简单,下面是代码:
def select(li,n):
    t = []
    for i in li:
        if i[1] == 0:
            t.append(i)
    t.sort()
    return (li.index(t[0]),li.index(t[1]))
def HuffmanCoding(lis):
    li = []
    for i in range(15):
        if i
    for i in range(8,15):
        s1,s2 = select(li[:i],i - 1)
        li[s1][1],li[s2][1] = i,i
        li[2],li[3] = s1,s2
        li[0] = li[s1][0] + li[s2][0]
    return li,lis
def Single_Code(li,lis):
    huf = []
    for i in range(8):
        s = ''
        while(li[1]):
            if li[li[1]][2] == i:
                s += '0'
            else:
                s += '1'
            i = li[1]
        s = list(s)
        s.reverse()
        s = ''.join(s)
        huf.append(s)
    return huf
def Coding(s,l):
    res = ''
    d = dict(l)
    for t in s:
        res += d.get(t)
    return res
def DeCoding(s,li):
    s = list(s)
    res = ''
    while(s):
        i = -1
        while(li[2] or li[3]):
            if s:
                x = s.pop(0)
                if x == '0':
                    i = li[2]
                elif x == '1':
                    i = li[3]
            else:
                break
        res += target
    return res
        
if __name__ == "__main__":
    lis = [5,29,7,8,14,23,3,11]
    li,lis = HuffmanCoding(lis)
    huf = Single_Code(li,lis)
    target = ['a','b','c','d','e','f','g','h']
    print '************************'
    print "char,weight,code"
    for i in  zip(zip(target,lis),huf):
        print i
    l = zip(target,huf)
    s = 'abcdefgh'
    print '************************'
    print 'Before coding:' + s
    s = Coding(s,l)
    print "After coding :" + s
    s = DeCoding(s,li)
    print 'Now Decoding :' + s
    print '************************'   
打印的输出结果是:
************************
char,weight,code
(('a', 5), '0001')
(('b', 29), '10')
(('c', 7), '1110')
(('d', 8), '1111')
(('e', 14), '110')
(('f', 23), '01')
(('g', 3), '0000')
(('h', 11), '001')
************************
Before coding:abcdefgh
After coding :00011011101111110010000001
Now Decoding :abcdefgh
************************
用python写几十行就搞定了,用C++只写了一个编码就用了150行左右,看来python还是比较方便的,等有时间了在改成用字节存储的,今天太晚了,睡了.

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/3176/showart_196467.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP