huffman编码python实现,元组赋值

huffman编码python实现

//ns是根据频率排序后的node列表
//tree是根据ns生成的Huffman树(用元组表示的树),tree就是node
//node -->(frequency,symbol)
//hc是遍历树产生的Huffman编码列表

def huffman(frs):
    ns=sorted([(x,y) for (y,x) in frs])
    tree=make_tree(ns)
    hc=traverse_tree(tree)
    return sorted(hc)

//当ns中不止一个node时,把前两个node的频率加起来,
//创建包含原来的两个node的新node,
//然后插入剩下的列表中,递归,当ns中只剩一个元素时,这个元素就是最后的Huffman树

def make_tree(ns):
    if len(ns)!=1:
        (f1,s1),(f2,s2),*tail=ns
        h=(f1+f2,((f1,s1),(f2,s2)))
        #nsr=sorted((h,*tail),key=lambda x:x[0]) 用这个替换下面一行也可
        nsr=insert(h,tail)
        return make_tree(nsr)
    else:
        return ns[0]

def insert(h,tail):
    for i in range(len(tail)):
        if h[0]<tail[i][0]:
            return (*tail[0:i],h,*tail[i:])
    return (*tail,h)

def traverse_tree(tree):
    return traverse_t(tree,'')

def traverse_t(tree,code):
        F,S=tree
        if type(S) != tuple:
            return [(S,code)]
        else:
            Left,Right=S
            hc1 = traverse_t(Left ,code+'0')
            hc2 = traverse_t(Right,code+'1')
            return [*hc1,*hc2]

>>> huffman([('A', 2), ('B', 4), ('C', 1), ('D', 1)])
[('A', '10'), ('B', '0'), ('C', '110'), ('D', '111')]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值