数据结构实验哈夫曼编码

数据结构------哈夫曼编码 全网最细节Huffman树和Huffman编码的教学!!!! 阅读详情

先构建一个结点类,其结构中包含有权值、双亲值、左孩子、右孩子、角标和Huffman编码。将数组里的数据,利用顺序表实现存储,调用Collections集合存放数据,调用其sort方法实现排序。然后选取其中最小的两个子树进行建立Huffman树。逆序计算Huffman编码,一次球1~n个结点对应的编码。建立一个临时存储Huffman编码的字符的数组,从的一个结点开始,通过该结点找到其双亲,若该结点是双亲的左孩子,则向数组输入为“0”,若是右孩子,则输入“1”。将临时数组中的值逆序输入到所求结点对应的二维数组中的那一行。这样就得到了所有结点的Huffman编码。

源码如下


public class Haff {
    public static int number;
    static List<Node> list;

    public static void main(String[] args) {

        list = new ArrayList<Node>();
        out.println("请输入个数:");
        Scanner scanner = new Scanner(System.in);
        number = scanner.nextInt();
        out.println("请输入权值:");
        int[] wightness = new int[number];
        for (int i = 0; i < wightness.length; ++i) {
            wightness[i] = scanner.nextInt();
        }
        for (int i = 0; i < number; ++i) {
            Node node = new Node(wightness[i], i);
            list.add(node);
        }
        Collections.sort(list);
        huffmanTree();
    }

    private static ArrayList<Integer> selectTwoMin() {
        ArrayList<Integer> List = new ArrayList<Integer>();
        Integer first = 0, second = 0;/* 两个最小值都初始化为下表为0 */
        double small1, small2;
        small1 = small2 = Double.MAX_VALUE;/* 将最大值和最小值初始化为double类型的最大值 */
        for (int i = 0; i < list.size(); ++i) {
            if (list.get(i).parent == -1) {
                if (small1 > list.get(i).weight) {
                    second = first;/* 更新次小的值 */
                    small2 = small1;
                    small1 = list.get(i).weight;/* 更新最小值 */
                    first = i;
                } else if (small2 > list.get(i).weight) {
                    small2 = list.get(i).weight;/* 更新次小值 */
                    second = i;
                }
            }
        }
        List.add(first);
        List.add(second);
        return List;
    }


    public static void huffmanTree() {

        for (int i = number; i < 2 * number - 1; i++) {
            ArrayList<Integer> min = selectTwoMin();
            Integer first = min.get(0);
            Integer second = min.get(1);
            Node left = list.get(first);
            Node right = list.get(second);
            left.setParent(i);
            right.setParent(i);
            Node parent = new Node(left.weight+right.weight,i);
            parent.setLchild(list.get(first).index);
            parent.setRchild(list.get(second).index);
            list.add(parent);

        }

        for (Node node : list) {
            node.huffmanCode(list);
            node.show();
        }
    }
}
public class Node implements Comparable<Node> {
    public int parent;
    private int lchild;
    private int rchild;
    public double weight;
    public int index;
    public String code;

    public Node(double weight, int index) {
        super();
        this.weight = weight;
        this.index = index;
        this.parent = -1; // 父节点初始化为-1,代表没有父节点
        this.lchild = -1; // 左孩子初始化为-1,代表没有左孩子
        this.rchild = -1; // 右结点初始化为-1,代表没有右孩子
        this.code = "";
    }

    public int compareTo(Node o) {
        if(this.weight < o.weight)
            return -1;
        else if(this.weight > o.weight)
            return 1;
        return 0;
    }


    public void show() {
        out.println("index  wight  rchild  lchild  code");
        out.println(index+"      "+weight+"      "+rchild+"      "+lchild+"     "+code);
    }

    public void setLchild(int lchild) {
        this.lchild = lchild;
    }

    public void setRchild(int rchild) {
        this.rchild = rchild;
    }

    public void setParent(int parent) {
        this.parent = parent;
    }

    public void huffmanCode(List<Node> list) {
        int parent = this.parent;
        int index = this.index;
        while (parent != -1) {	//结点的父节点为-1代表这个结点是根节点,树叶不断寻找父节点,由下向上求哈夫曼编码
            if (list.get(parent).lchild == index)
                code += "0";	//如果树叶是树叶父节点的左孩子
            else
                code += "1";

            index = list.get(parent).index;
            parent = list.get(parent).parent;
        }
        StringBuffer reverse = new StringBuffer();
        for (int i = code.length() - 1; i >= 0; --i)
            reverse.append(code.charAt(i));

        code = reverse.toString();
    }
}

数据结构实验-哈夫曼编码 实验目的: (1) 掌握二叉树的定义; (2) 掌握哈夫曼树和哈夫曼编码算法的实现。 实验内容: 实现一个哈夫曼编码系统,系统包括以下功能: (1) 字符信息统计:读取待编码的源文件SourceFile.txt,统计出现的字符及其频率。 附:SourceFile.txt文件内容为 U ARE THE BEST IN MY HEART (2) 建立哈夫曼树:根据统计结果建立哈夫曼树。 (3) 建立... 阅读详情

相关推荐

数据结构实验,哈夫曼编码/译码系统

1. 实验名称: 二叉树的基本操作及哈夫曼编码译码系统的实现   2.实验目的: 创建一棵二叉树,实现先序、中序和后序遍历一棵二叉树,计算二叉树结点个数等操作。哈夫曼编码/译码系统。   3. 实验任务:        能成功演示二叉树的有关运算,运算完毕后能成功释放二叉树所有结点占用的系统内存。   4. 实验内容   (1)在二叉链表上实现二叉树运算 a)        设

/ 1万+

数据结构实验——哈夫曼编码

目录 问题描述 基本要求 问题分析 实验代码 运行结果 实验总结 问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发编写一个哈夫曼码的编/译码系统。 基本要求 (1)接收原始数据(电文):从终端输入电文(电文为一个字符串,假设仅由26个小写英文字母构成)。 (

Anffen的博客 9332

数据结构 实验二 哈夫曼编码和译码

实验目的: 1、熟悉二叉树的顺序存储结构; 2、熟悉二叉树的顺序存储结构和具体实现; 3、熟悉哈夫曼编码和译码,及其在顺序存储结构下的实现 实验要求: 1、根据输入构造一棵哈夫曼树,要求该哈夫曼树的左子树小于等于右子树; 2、根据构造的哈夫曼树给出对应的编码;左子树的编码为0,右子树的编码为1; 3、输出各个字符对应的编码与平均编码长度; 4、根据输入的编码,结合构造的哈夫曼树给出...

Gamer_Lee的博客 4676

【数据结构】实验十:哈夫曼编码

数据结构实验

m0_65787507的博客 4031

数据结构——哈夫曼编码实验

程序所能达到的功能: 根据给定的字符和其中每个字符的频度,构造哈夫曼树,字符出现的频率作为结点的值 并输出字符集中每个字符的哈夫曼编码. 将给定的字符串根据其哈夫曼编码进行编码,并进行相应的译码. #include<iostream> #include<string> #define maxvalue 12 #define maxleaf 12 #define maxnode 23 using namespace std; int n=0; int v=0; string s; ty

WQLWWW的博客 865

数据结构哈夫曼编码实验报告

利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码

C语言 数据结构 哈夫曼树的创建与哈夫曼编码

1、掌握哈夫曼树的三叉链表存储结构。2、掌握利用构造哈夫曼树的算法。3、掌握利用哈夫曼树进行哈夫曼编码及译码。

i13145821的博客 726

数据结构实验-哈夫曼树与哈夫曼编码

一、问题描述 运用哈夫曼算法构造哈夫曼树,并得到哈夫曼编码。 输入格式:10,5,21,18,8,13 二、实验目的 掌握哈夫曼算法。 三、实验内容及要求 1、构造哈夫曼树和哈夫曼编码的存储结构。 2、实现哈夫曼算法,实现哈夫曼树的存储并求出哈夫曼编码。

哈夫曼编码(数据结构实验)

前言 哈夫曼编码又称最优树,是一种典型的贪心算法,这种编码方式最大的优点就是用最少的字符包含最多的信息。 哈夫曼编码是一种前缀编码,或者称非前缀编码,这种编码的特点是没有任何字是其他码的前缀。 步骤 1、创建一个优先级队列 当然不一定要用优先级队列,也可以用普通数组代替,相比优先队列,普通数组在程序中要每次都比较节点权重的大小 2、构建哈夫曼树 对于给定的有各自权值的 n 个结点; 在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和; 在原有的

weixin_46471800的博客 2477

数据结构实验-哈夫曼编码C语言实现(实验报告内有代码和运行结果)

利用哈夫曼编码进行住处通讯可以大大提高信道利用率,缩短住处传输时间,降低成本,但是,这要求在发送端通过一个编码系统将传输的数据预先编码,在接收端通过一个译码系统对传来的数据进行译码(复原),对于双向传输信息的信道,每端都一个完整的编码译码系统,试为这样的住处收发站写一个哈夫曼友的编码译码系统.

一文读懂:CAN总线Bus-Off的触发条件与自动恢复机制

本文详细解析CAN总线Bus-Off状态的触发条件与自动恢复机制。根据ISO 11898-1标准,当发送错误计数器(TEC)超过255时节点进入Bus-Off状态,并通过检测128次总线空闲条件实现自动恢复。文章结合实战案例,探讨硬件故障、软件配置及电磁干扰等常见触发场景,并提供快慢恢复策略与调试方法,帮助工程师快速定位并解决CAN网络故障。

rgv234567的博客 359

数据结构实验之二叉树六:哈夫曼编码

数据结构实验之二叉树六:哈夫曼编码 Description 字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%~90%之间。你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼编码长度的比值。 Input 输入数据有多组,每组数据一行,表示要编码的字符串。 Output 对应字符的ASCII

qq_45885219的博客 837

别再手动算LLC了!用Mathcad 15分钟搞定谐振参数与增益曲线(附已验证产品案例)

本文详细介绍了如何利用Mathcad在15分钟内高效完成LLC谐振变换器的参数计算与增益曲线绘制。通过对比传统工具,突出Mathcad在自然数学表达、实时单位换算和动态参数关联方面的独特优势,帮助电源工程师大幅提升设计效率。文章还提供了已验证的产品案例和实用模板,助力工程师快速掌握谐振参数优化技巧。

weixin_42548888的博客 546

数据结构实验5:哈夫曼树与哈夫曼编码

通过本次实验,我更深入地理解了哈夫曼编码的原理和实现方式,并学会了如何将算法封装。在本次实验中,我们设计了一个用于构建哈夫曼树和生成哈夫曼编码的数据结构和算法。我们进行了两组测试,分别使用不同的输入数据来测试哈夫曼树的构建和编码生成功能。从测试结果可以看出,哈夫曼树构建和编码生成功能正常工作,成功生成了有效的哈夫曼编码。在解决这个问题中,我学到了如何构建哈夫曼树和生成哈夫曼编码。2、实现哈夫曼算法,实现哈夫曼树的存储并求出哈夫曼编码。

宁清的博客 901

ADS124S08配置避坑指南:从SPI时序到寄存器设置,手把手教你调通24位ADC

本文详细解析了ADS124S08 24位ADC的SPI时序配置、寄存器设置及外围电路设计中的关键细节,帮助工程师避开常见陷阱。从SPI通信模式选择到DRDY引脚读取优化,再到基准电压启动时间调整,提供了实战验证的解决方案,确保高精度数据采集的稳定性。

weixin_29192365的博客 285

Jetson Orin NX上CAN总线调试全攻略:从硬件焊接到开机自启动(附常见问题解决方案)

本文详细介绍了在NVIDIA Jetson Orin NX开发板上进行CAN总线调试的全过程,包括硬件焊接、驱动配置、通信测试和开机自启动设置。针对常见问题如信号接反、波特率设置等提供了实用解决方案,帮助开发者快速实现稳定的CAN总线通信。

c2d3e4f的博客 1076

数据结构-哈夫曼编码实验

哈夫曼编码实验

weixin_60925698的博客 1055

Python 逆向解析知乎盐选反爬字体,实现内容精准还原

本文详细解析了知乎盐选内容的反爬字体机制,并提供了使用Python逆向解析WOFF字体文件的完整方案。通过fontTools库构建解码字典,实现乱码文本的精准还原,帮助开发者应对动态字体策略,同时强调法律与道德风险。

weixin_29268385的博客 1295

数据结构实验哈夫曼树及哈夫曼编码C语言,数据结构——实验四哈夫曼树与哈夫曼编码...

1、软 件 学 院哈夫曼树与哈夫曼编码实验报告课程名称: 数据结构 姓 名: 郑斌 学 号: 7 班 级: 卓越131 实验四 哈夫曼树与哈夫曼编码一、实验目的1、使学生熟练掌握哈夫曼树的生成算法。2、熟练掌握哈夫曼编码的方法。二、实验内容本次实验提供3个题目,难度相当,学生可以根据自己的情况选做,其中题目一是必做题,其它选作!题目一、哈夫曼树和哈夫曼编码问题描述一电文,有若干个不同字符,要求从终...

weixin_42191440的博客 1486

动态规划法:n*m方格前进问题

在一个n*m的方格中,m为奇数,放置有n*m个数,方格中间的下方有一人,此人可按照正前方相临的五个方向(方格)前进但不能越出方格。人每走过一个方格必须取此方格中的数。要求找到一条从底到顶的路径,使其数相加之和为最大。输出和的最大值。 算法设计: 可以使用动态规划方法,从顶部开始,将第二排的每个数加上顶部第一排的最优解,将6排的问题缩小为5排的问题,然后重复该操作,直到底部最后一排,此时

Winifred_1997的博客 4675

【动态导通电阻】p-GaN HEMTs正向和反向导通下的动态导通电阻

2024年,浙江大学的研究团队通过多组双脉冲测试方法,深入研究了两种商用p-GaN栅极HEMTs在正向和反向导通模式下的动态导通电阻(RON)特性。研究发现,肖特基型p-GaN栅极HEMTs在反向导通时动态RON比正向导通高3%-5%,而混合漏极嵌入栅注入晶体管在反向导通时动态RON降级较轻,降低约10%。此外,随着漏极电流(IDS)的增加,两种器件在反向导通时动态RON先减小后增加,形成“谷底”现象。

荷塘阅色 825

数据结构实验总结(一元多项式相乘,迷宫问题,哈夫曼编码,迪杰斯特拉算法)

本文所有代码打包链接:https://download.youkuaiyun.com/download/qq_39932172/11211533 实验一:求两个一元多项式P(x)和Q(x)的乘积: P(x)*Q(x) 一、实验要求: 1.通过键盘随机输入两个多项式P(x)和Q(x)的内容。 2.输出结果要有P(x)和Q(x)以及它们的乘积P(x)*Q(x)。 二、实验程序: #include<std...

Lil Wing 868

Unity Shader之路(一)什么是Unity Shader?

Unity Shader前言什么是UnityShaderUnity Shader和材质的关系 前言 众所周知,要想当游戏开发工程师,Unity中的Shader编写不得不摸,这一系列文章我将描写我的Shader学习之路,致敬冯乐乐的书Unity Shader入门精要,此篇什么是Unity Shader?希望能给后人一点方向 我们刚开始接触Unity的时候,总是会遇到材质,但是不了解材质都是什么,为什么可以在很多材质中选择,为什么有时候选择了其他材质后就不能达到我们想要的结果,为什么资源商店有那么多的材质,山.

TurboQ珞珈 2237

day9——数据结构实验之二叉树六:哈夫曼编码(里面用到的思想很重要哦!!!)

数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩...

芒果summer小仙女 430

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 数据结构实验一元稀疏多项式
下一篇: 数据结构课程设计 关键路径
java洲
博客等级 码龄6年 5粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值