【贪心算法】Huffman Tree

Huffuman 编码问题:

变长编码(variable-length code)可以达到比定长编码好很多的压缩率,其思想史赋予高频字符短码字,低频字符长码字。前缀码(prefix code)可以保证

没有任何码字是其他码字的前缀。赫夫曼编码采用依赖于贪心算法选择性质和最优子结构 构造最优前缀码。

其执行过程如下: 选择当前最小的两个节点作为树左右子节点,并把和作为下次统计的对象中。

                                                                             image

构造hafuman树: 选取当前最小频率的两个节点,作为树的左右子节点,按从下往上的顺序构Huffman树。最后返回根节点

node getHuffmanTree() 
{
    while(!nodeArray.empty()) 
    {

        node * tempNode = new node;   
        node * tempNode1 = new node; 
        node * tempNode2 = new node; 
        *tempNode1 = extractMin(); 
        *tempNode2 = extractMin();

        tempNode->leftChild = tempNode1; 
        tempNode->rightChild = tempNode2; 
        tempNode->frequency = tempNode1->frequency+tempNode2->frequency; 
        nodeArray.push_back(*tempNode); 
        if(nodeArray.size() == 1)//only the root node exsits 
        { 
            break; 
        } 
    } 
    return nodeArray[0]; 
}


哈弗曼 编码:  s.erase(s.end()-1); 是往父节点回退,从而按从上往下层级、左,中,右顺序 遍历完树

void BFS(node * temproot,string s) 
{ 
    node * root1 = new node; 
    root1 = temproot;
    root1->code = s; 
    if(root1 == NULL) 
    {
    } 
    else if(root1->leftChild == NULL && root1->rightChild == NULL) 
    {
        cout<<"the content is "<<root1->content<<endl; 
        cout<<"and its corresponding code is "<<root1->code<<endl; 
    } 
    else 
    {
        root1->leftChild->code = s.append("0"); 
        s.erase(s.end()-1); 
        root1->rightChild->code = s.append("1"); 
        s.erase(s.end()-1);

        BFS(root1->leftChild,s.append("0")); 
        s.erase(s.end()-1); 
        BFS(root1->rightChild,s.append("1")); 
        s.erase(s.end()-1); 
    }
}


image

 

最后记下 动态规划和贪心算法的不同,虽然都具有最优子结构性质(问题最优解包含子问题最优解), 贪心算法仅仅是做出局部最优来构造全局最优,不考虑子问题的解。而动态规划,每次进行选择通常依赖子问题的解,自底向上的方式,先求解子问题,然后较大子问题。贪心算法总是做出当时看来最佳,然后求解剩余子问题,与将来的问题无关。

代码://jqyhuffman.blogspot.sg/

参考:

https://en.wikipedia.org/wiki/Huffman_coding

《算法导论》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不负初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值