java哈弗曼编码的实现

哈夫曼树编码及反编码 #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #define MAXVALUE 1000 #define MAXLEAF 30 #define MAXNODE (MAXLEAF*2-1) #define MAXBIT 10 using namesp... 阅读详情
//哈弗曼编码的实现类
public class HffmanCoding {
    private int charsAndWeight[][];// [][0]是 字符,[][1]存放的是字符的权值(次数)
    private int hfmcoding[][];// 存放哈弗曼树
    private int i = 0;// 循环变量
    private String hcs[];


    public HffmanCoding(int[][] chars) {
        // TODO 构造方法
        charsAndWeight = new int[chars.length][2];
        charsAndWeight = chars;
        hfmcoding = new int[2 * chars.length - 1][4];// 为哈弗曼树分配空间
    }


    // 哈弗曼树的实现
    public void coding() {
        int n = charsAndWeight.length;
        if (n == 0)
            return;
        int m = 2 * n - 1;
        // 初始化哈弗曼树
        for (i = 0; i < n; i++) {
            hfmcoding[i][0] = charsAndWeight[i][1];// 初始化哈弗曼树的权值
            hfmcoding[i][1] = 0;// 初始化哈弗曼树的根节点
            hfmcoding[i][2] = 0;// 初始化哈弗曼树的左孩子
            hfmcoding[i][3] = 0;// 初始化哈弗曼树的右孩子
        }
        for (i = n; i < m; i++) {
            hfmcoding[i][0] = 0;// 初始化哈弗曼树的权值
            hfmcoding[i][1] = 0;// 初始化哈弗曼树的根节点
            hfmcoding[i][2] = 0;// 初始化哈弗曼树的左孩子
            hfmcoding[i][3] = 0;// 初始化哈弗曼树的右孩子
        }


        // 构建哈弗曼树
        for (i = n; i < m; i++) {
            int s1[] = select(i);// 在哈弗曼树中查找双亲为零的 weight最小的节点
            hfmcoding[s1[0]][1] = i;// 为哈弗曼树最小值付双亲
            hfmcoding[s1[1]][1] = i;
            hfmcoding[i][2] = s1[0];// 新节点的左孩子
            hfmcoding[i][3] = s1[1];// 新节点的右孩子
            hfmcoding[i][0] = hfmcoding[s1[0]][0] + hfmcoding[s1[1]][0];// 新节点的权值是左右孩子的权值之和
        }


    }


    // 查找双亲为零的 weight最小的节点
    private int[] select(int w) {
        // TODO Auto-generated method stub
        int s[] = { -1, -1 }, j = 0;// s1 最小权值且双亲为零的节点的序号 , i 是循环变量
        int min1 = 32767, min2 = 32767;
        for (j = 0; j < w; j++) {
            if (hfmcoding[j][1] == 0) {// 只在尚未构造二叉树的结点中查找(双亲为零的节点)
                if (hfmcoding[j][0] < min1) {
                    min2 = min1;
                    s[1] = s[0];
                    min1 = hfmcoding[j][0];
                    s[0] = j;


                } else if (hfmcoding[j][0] < min2) {
                    min2 = hfmcoding[j][0];
                    s[1] = j;
                }
            }
        }


        return s;
    }


    public String[] CreateHCode() {// 根据哈夫曼树求哈夫曼编码
        int n = charsAndWeight.length;
        int i, f, c;
        String hcodeString = "";
        hcs = new String[n];
        for (i = 0; i < n; i++) {// 根据哈夫曼树求哈夫曼编码
            c = i;
            hcodeString = "";
            f = hfmcoding[i][1]; // f 哈弗曼树的根节点
            while (f != 0) {// 循序直到树根结点
                if (hfmcoding[f][2] == c) {// 处理左孩子结点
                    hcodeString += "0";
                } else {
                    hcodeString += "1";
                }
                c = f;
                f = hfmcoding[f][1];
            }
            hcs[i] = new String(new StringBuffer(hcodeString).reverse());
        }
        return hcs;
    }


    public String show(String s) {// 对字符串显示编码
        String textString = "";
        char c[];
        int k = -1;
        c = new char[s.length()];
        c = s.toCharArray();// 将字符串转化为字符数组
        for (int i = 0; i < c.length; i++) {
            k = c[i];
            for (int j = 0; j < charsAndWeight.length; j++)
                if (k == charsAndWeight[j][0])
                    textString += hcs[j];
        }
        return textString;


    }


    // 哈弗曼编码反编译
    public String reCoding(String s) {


        String text = "";// 存放反编译后的字符
        int k = 0, m = hfmcoding.length - 1;// 从根节点开始查询
        char c[];
        c = new char[s.length()];
        c = s.toCharArray();
        k = m;
        for (int i = 0; i < c.length; i++) {
            if (c[i] == '0') {
                k = hfmcoding[k][2];// k的值为根节点左孩子的序号
                if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// 判断是不是叶子节点,条件(左右孩子都为零)
                {
                    text += (char) charsAndWeight[k][0];
                    k = m;
                }
            }
            if (c[i] == '1') {
                k = hfmcoding[k][3];// k的值为根节点右孩子的序号
                if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// 判断是不是叶子节点,条件(左右孩子都为零)
                {
                    text += (char) charsAndWeight[k][0];
                    k = m;
                }


            }
        }
        return text;
    }
}
华为OD机试双机位C卷-统计差异值大于相似值二元组个数(C/C++/Py/Java/Js/Go) 华为OD机试(机考)双机位C卷 【统计差异值大于相似值二元组个数】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 统计差异值大于相似值二元组个数 阅读详情

相关推荐

ITK-snap进行分割区域标注、三维显示及改变显示颜色

在进行医学图像器官分割时,无论我们是用传统方法还是深度学习,最后肯定要用到手动分割的区域作为金标准来验证我们方法的精度。但是手动标注器官的轮廓是十分耗时的,这里我介绍一个比较简单的标注方法,以肺分割作为例子。 我们使用ITK-snap作为分割标注工具。 当切片间距离比较小时,比如1mm,一个患者的完整HRCT序列通常在200张以上,如果让医生一一进行分割区域标注是非常耗时乏味的。因此,我们可以使用最简单的阈值法比如OSTU,加上基本的形态学操作对肺进行粗分割得到粗略的分割掩码,在此基础上再手动的对分割结果进

u010409517的博客 2万+

java 哈夫曼编码反编码的实现

//哈弗曼编码的实现类 public class HffmanCoding { private int charsAndWeight[][];// [][0]是 字符,[][1]存放的是字符的权值(次数) private int hfmcoding[][];// 存放哈弗曼树 private int i = 0;// 循环变量 private String hcs[]...

weixin_30709809的博客 144

风二西CTF流量题大集合-刷题笔记|基础题(1)

部分题目已包含脚本和解题视频,但更建议自行分析和手搓脚本。

zerorzeror的博客 2765

实战详解java反编译字节码(操作指令助记符)

【新建对象分为4步】new:新建对象,在堆中为对象分配存储空间,并压入操作数栈顶;dup:复制栈顶部一个字长内容,入栈(此时栈有两个相同地址);invkespecial:构造函数调用初始化方法:()V,操作数栈顶弹出ByteCodeTest对象引用(dup);astore_1:从操作数栈顶取出ByteCodeTest对象存入局部变量1。 【方法调用有5种方式:】invokespecial:调用当前类方法;invokevirtual:调用引入类的方法;invokeinterface:调用接口方法;......

天然玩家的博客 2502

CUDA 12.1环境下的动态库链接修复:从libcusparse.so.12的undefined symbol错误到libnvJitLink.so.12的正确加载

本文详细解析了在CUDA 12.1环境下,PyTorch因libcusparse.so.12找不到libnvJitLink.so.12中的__nvJitLinkAddData_12_1符号而报错的根本原因。通过诊断动态链接过程,提供了创建符号链接、修改环境变量等三种解决方案,并深入探讨了nvJitLink组件的作用及环境配置的最佳实践,帮助开发者彻底解决此类动态库链接问题。

c8d9e0f1的博客 206

SAP WMS开发实战:用BAPI_L_TO_CREATE_MULTIPLE搞定LT01转储单(附完整代码)

本文详细解析了SAP WMS开发中如何利用BAPI_L_TO_CREATE_MULTIPLE函数模块批量创建LT01转储单。文章深入剖析了核心参数、常见错误及实战代码框架,重点强调了源/目标存储类型等关键字段的获取方法,为系统集成与自动化流程开发提供了可靠的解决方案。

view3的博客 561

哈夫曼编码26个大写字符及空格、打印字符串的哈夫曼编码译文长度、哈夫曼编码反编译。

     实现一个哈夫曼树的应用程序,可以按照以下每个字符的出现频率(权值){空格和26个英文字母出现频率分别为:186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1}创建一棵哈夫曼树(要求左孩子的权值小于等于右孩子的权值);并输出所有报文字符的编码,并将“THIS PROGRAM IS MY FA...

Jop_qq的博客 7261

NVIDIA DRIVE SDK深度解析(一)——核心组件与安全架构设计

本文深度解析NVIDIA DRIVE SDK的核心组件与安全架构设计,涵盖DriveOS、加速库和应用框架三层架构,以及虚拟化与安全隔离机制。重点探讨了安全岛设计、媒体处理流水线和功能安全监控体系,为开发者提供自动驾驶系统开发的实战建议和性能优化技巧。

weixin_28704565的博客 566

Java笔记——Java基础---Java反编译

最早的程序员都是直接用机器语言编程,但是很麻烦,需要查大量的表格来确定每个数字表示什么意思,编写出来的程序很不直观,而且容易出错,于是有了汇编语言,把机器语言中一组一组的数字用助记符(Mnemonic)表示,直接用这些助记符写出汇编程序,然后让汇编器(Assembler)去查表把助记符替换成数字,也就把汇编语言翻译成了机器语言。jad很好用,但是无奈的是很久没更新了,所以只能用一款新的工具替代他,CFR是一个不错的选择,相比jad来说,他的语法可能会稍微复杂一些,但是好在他可以work。

a25847a的博客 3073

R以及Rstudio超详细安装教程(包括安装过程中出现的问题)

R安装及Rstudio安装,以及安装中出现的问题

2301_76908257的博客 1万+

用Python爬取公众号历史所有文章,看这篇就够了

手把手教你爬取公众号历史所有文章

u010522887的专栏 1万+

用java实现曼彻斯特编码_java实现哈弗曼编码

根据输入的各个叶节点的权值,构建一棵最优树,根据最小带全路径,确定由0,1组成的哈弗曼编码。首先在一个封装类TNode中构建一棵树的元素,比如权值,左节点,右节点,同时在TNode类中构建了哈弗曼编码值,以及判断节点是否为叶子节点package霍夫曼编码;/****@authorluckid*@version2014_10_11**//*** 定义Huffman编码的节点*/public clas...

weixin_36014846的博客 329

芒果YOLO11改进146:OBB旋转检测头Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

OBB旋转检测头Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

包括YOLOv5、YOLOv7、YOLOv8等模型改进 643

哈弗曼编码与反编码的实现 java源代码

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34380781的博客 116

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

算法java实现--贪心算法--哈弗曼编码

哈弗曼编码的java实现(贪心算法) 具体问题描述以及C/C++实现参见网址

qipanliming的专栏 2615

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

哈弗曼编码与反编码的实现 java源代码

哈弗曼编码与反编码的实现  java源代码下载地址:http://download.youkuaiyun.com/source/2357457public class Huffman { public static void main(String[] args) { new HaffmanFrame(); } } //主界面类 import java.awt.*; import java.awt.event.*; import javax.swing.*; //主界面 public

我就是我不一样的美男子! 2306

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

贪心算法实例java,算法java实现--贪心算法--哈弗曼编码

哈弗曼编码的java实现(贪心算法)具体问题描述以及C/C++实现参见网址http://blog.youkuaiyun.com/liufeng_king/article/details/8720896import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;...

weixin_39553753的博客 264

哈弗曼编码的java实现

import java.util.*;/** * Created by lipu on 17-6-28. */class Node { Character c; int power; Node left = null; Node right = null; boolean isC = false; String s = null; Node(C

u010742342的博客 503

哈夫曼树编码算法 java_java实现哈弗曼编码与反编码实例分享(哈弗曼算法)

//哈弗曼编码的实现类public class HffmanCoding {private int charsAndWeight[][];// [][0]是 字符,[][1]存放的是字符的权值(次数)private int hfmcoding[][];// 存放哈弗曼树private int i = 0;// 循环变量private String hcs[];public HffmanCoding...

weixin_39673972的博客 115

java实现哈弗曼编码

根据输入的各个叶节点的权值,构建一棵最优树,根据最小带全路径,确定由0,1组成的哈弗曼编码。 首先在一个封装类TNode中构建一棵树的元素,比如权值,左节点,右节点,同时在TNode类中构建了哈弗曼编码值,以及判断节点是否为叶子节点 package 霍夫曼编码; /** * * @author luckid * @version 2014_10_11 * ...

weixin_30315905的博客 90
上一篇: java各种数据库连接
下一篇: 人民币转成大写
hwctl
博客等级 码龄20年 13粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值