首页 > 其他分享 >哈夫曼树哈夫曼编码

哈夫曼树哈夫曼编码

时间:2023-11-30 23:34:28浏览次数:18  
标签:编码 哈夫曼 int num 权值 nodes 节点

一、 实验目的

掌握哈夫曼算法

二、 实验内容

实验题目

哈夫曼树哈夫曼编码

三、  设计文档

 

四、   源程序

 #include<bits/stdc++.h>

using namespace std;

const int N=100010;

struct node{

    int num,fa,ch;

};

bool st[N];

int n;

node* nodes;

int find(int n){

    int p=0;

    for(int i=1;i<=n;i++){

        if(st[i]==0&&(p==0||nodes[i].num<nodes[p].num)){

            p=i;

        }

    }

    return p;

}

void add(int lc,int rc,int p){

    nodes[lc].fa=p;

    nodes[lc].ch=-1;

    nodes[rc].fa=p;

    nodes[rc].ch=1;

    nodes[p].num=nodes[lc].num+nodes[rc].num;

}

string huffman(int k){

    string s;

    if(nodes[k].fa){

        s=huffman(nodes[k].fa);

    }

    if(nodes[k].ch){

        s+=nodes[k].ch==-1?"0":"1";

    }

    return s;

}

int main(){

    cin>>n;

    nodes=new node[2*n];

    for(int i=1;i<=n;i++){

        cin>>nodes[i].num;

    }

    if(n==1||n==0){

        cout<<"error";

    }else{

        int l=n+1,r=2*n-1;

        while(l<=r){

            int c1=find(l-1);

            st[c1]=1;

            int c2=find(l-1);

            st[c2]=1;

            add(c1,c2,l++);

        }

        int wpl=0;

        for(int i=1;i<=n;i++){

            string s=huffman(i);

            cout<<nodes[i].num<<"编码为"<<s<<endl;

            wpl+=nodes[i].num*s.size();

        }

        cout<<"WPL:"<<wpl;

    }

    return 0;

}

 

 

五、  个人体会(此部分与拼题a上主观题提交应一致)

1.实验中遇到的具体问题

1)输入数据的异常值或错误:在输入权值时,可能会输入异常值(例如负数、0或非整数)或错误的数据类型。这可能导致程序崩溃或产生错误的结果。

2)内存问题,开始用的nodes[n]报错。

2、 问题如何解决的

1)进行一个异常数值的判断,如果节点数量为1或者0,输出错误信息并结束程序 。

2)程序使用了一个大小为n*2的nodes数组来存储节点信息。

3、 实验设计思路,实验后的感想。

实验设计思路

首先,通过输入叶子节点个数和权值来构建哈夫曼树。

根据输入数据,使用优先队列(例如二叉堆)构建哈夫曼树。具体实现过程包括将节点按照权值大小插入队列中,然后每次从队列中取出两个最小的节点合并成一个新的节点,并将新节点插入队列中,直到队列中只剩下一个节点为止。

然后,使用哈夫曼树进行编码,将每个叶子节点的权值转化为对应的二进制编码。

输出每个叶子节点的权值和对应的二进制编码。

计算出带权路径长度,即所有叶子节点权值与它们对应的二进制编码长度的乘积之和。

输出带权路径长度。

实验后的感想:

通过实验,我更加深入地了解了哈夫曼编码的原理和实现方法。在构建哈夫曼树的过程中,需要考虑如何选择节点和如何合并节点,这些操作需要细心思考和尝试。我还发现了自己在编程方面的一些不足之处,例如对细节的把握和对算法的理解不够深入,内存分配问题。 我深刻地认识到了学习和实践的重要性。只有不断地学习和实践,才能够不断提高自己的能力和水平。同时,我也意识到了在未来的学习和工作中,需要更加注重细节和思考问题的全面性。

 

 

标签:编码,哈夫曼,int,num,权值,nodes,节点
From: https://www.cnblogs.com/aixin52129211/p/17868679.html

相关文章

  • 江科大STM32(3):定时器(4)定时器的编码器接口
    1.编码器接口简介EncoderInterface编码器接口编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用定时器都拥有1个编码器接口两个输入引脚借用了输入捕获的通道1和......
  • 哈夫曼树哈夫曼编码
    哈夫曼树哈夫曼编码 输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。#include<iostream>#include<cstring>usingnamespacestd;typedefchar**HuffmanCode;typedefstruct{intweight;intlchild,rchild,parent;}HTNode,*HuffmanTree;void......
  • C++使用OpenSSL实现Base64编码、解码实例----亲测OK
    摘自:https://www.dandelioncloud.cn/article/details/1498198300963708930 //Base64Util.h#ifndef__BASE64_UTIL_H__#define__BASE64_UTIL_H__#ifdef__cplusplus//告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的extern"C"{#endifstringUTIL......
  • url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介
    引子浏览器URl地址,上网一定会用到,但是浏览器地址有中文或者浏览器url参数操作的时候,经常会用到encodeURIComponent()和decodeURIComponent()以及encodeURI()等等。关于浏览器参数操作,请看文章javascript浏览器参数的操作,js获取浏览器参数 ,今天主要讲讲escape(),encodeURI(),enco......
  • JavaScript编码风格指南
    sidebar:autosidebarDepth:4JavaScript编码风格指南内容出处:NicholasC.Zakas《编写可维护的JavaScript》GoogleJavaScriptStyleGuidecrockfordJSLintESLint好狗电影导航源文件基础命名文件名必须全部小写,并且可以包含下划线(_)或短划线(-),但不包含......
  • Base64编码、解码 C语言例子(使用OpenSSL库)
    #include<stdio.h>#include<string.h>#include<unistd.h>#include<openssl/pem.h>#include<openssl/bio.h>#include<openssl/evp.h>intbase64_encode(char*in_str,intin_len,char*out_str){BIO*b64,*bio;......
  • 第三章 编码风格
    第三章编码风格注释总结起来一句话:优秀的代码本身就容易阅读,注释只需要提供有用的附加信息分解分解(decomposition)指将代码分为小段.理想情况下,每个函数或方法都应该只完成一个任务.任何非常复的子任务都应该分解为独立的函数或方法.重构(refactoring)指重新构建代......
  • 自定义应用层通信协议结构消息的编码方式
    应用层通信协议设计 一、应用层通信协议概述TCP/UDP是基于字节流的传输层通信协议,对于其的编程是基于IO流编程,所谓“流”,就是没有界限的一长串二进制数据。TCP/UDP作为传输层协议,并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分。所以在业务上......
  • Netty源码学习6——netty编码解码器&粘包半包问题的解决
    系列文章目录和关于我零丶引入经过《Netty源码学习4——服务端是处理新连接的&netty的reactor模式和《Netty源码学习5——服务端是如何读取数据的》的学习,我们了解了服务端是如何处理新连接并读取客户端发送的数据的:netty的reactor:主reactor中的NioEventLoop监听accept事件,然......
  • C++ 字符串编码转换封装函数,UTF-8编码与本地编码互转
    简介字符串编码转换封装函数,UTF-8编码与本地编码互转。中文乱码的解决方法有时候我们会遇到乱码的字符串,比如:古文码可能是用GBK方式读取UTF-8编码的中文导致的,用下面的Utf8ToLocal(stringstr)函数转换一下就可以了。口字码可能是因为以UTF-8的方式读取GBK编码的中文导致的,用下面......