java的huffman实现的简单介绍

本文目录一览:

Java实现哈夫曼算法,运行出现问题,求帮助,在线等!!!

可以在Dog与Cat类中重写Animal中的animalDo方法,通过调用animalDo方法,

然后会自动根据不同的实例调用不同类中的方法(多态知识)。

.’>数据结构程序作业 Huffman编码 是java版的哈 求帮忙呀 ~>.

import java.util.Random;class HuffmanTree

{

Node[] nodes;

HuffmanTree(Node[] nodes) {

this.nodes = nodes;

}

public static Node buildTree(Node[] nodes, int end) {

sort(nodes,end); // 根据树的权值由小到大排序

// 取出取值最小的两棵树

Node first = nodes[0];

Node second = nodes[1];

int data = first.data + second.data;

nodes[0] = new Node(data, first, second); //把前两棵树结合为新的树放到第一位

if (end == 1)

{

return nodes[0];

} else

{

for (int i = 1; i end-1 ; i++)

{

nodes[i] = nodes[i + 1]; // 将原数组的第三个以后的树前移一位

}

int len = end – 1;

return buildTree(nodes, len);

}

}

public static void sort(Node[] nodes,int end) {

for (int i = 1; i end; i++)

{

for (int j = 0; j i; j++)

{

if (nodes[j].data nodes[i].data)

{

Node temp = nodes[j];

nodes[j] = nodes[i];

nodes[i] = temp;

}

}

}

}

static String code = “”; // 记录递归路径 static String data = “”;

static String str = “”;

public static void recurse(Node node) {

if (node.data != null)

{

str += ” ” + node.data;

}

if (node.left != null)

{

code += “0”;

recurse(node.left);

}

if (node.right != null)

{

code += “1”;

recurse(node.right);

}

if (node.right == null node.left == null) // 递归达到叶节点取出code

{

System.out.println(node.data + ” : ” + code);

}

if (code.length() = 1)

{

code = code.substring(0, code.length() – 1); // 去掉code最后一位

}

}

public static void main(String[] args) {

Node[] nodes = new Node[50]; // 免得插入这么多字母 我这里就不一一列举了 你只需改一下这个数组 里面装26个字母的权值, 如果要带字母就在Node加一个成员变量就可以了 for (int i =0;i50 ;i++ )

{

Random r = new Random();

int n = r.nextInt(26);

nodes[i]=new Node(n,null,null);

}

Node n = buildTree(nodes,49);

recurse(n);

System.out.println(“前序输出” + str);

}

}

class Node{

Integer data;

Node left;

Node right;

Node(Integer data, Node left, Node right) {

this.data = data;

this.left = left;

this.right = right;

}

}

用JAVA实现HUFFMAN算法 1 HUFFMAN算法原理 2 流程图 3 用JAVA语言编写代码

import java.util.*;

class HuffmanCode{

String name;

double weight;

int lc,rc,pa;

public HuffmanCode(){

name=””;

weight=0;

lc=-1;rc=-1;pa=-1;

}

}

public class Huffman {

HuffmanCode[] codes;

String[] huffstring;

StringBuffer buffer=new StringBuffer();

public Huffman(String s) {

for(int i=0;is.length();i++){

if(buffer.indexOf(s.substring(i,i+1))==-1){

buffer.append(s.charAt(i));

}

}

System.out.println(“字母:”+buffer);

huffstring=new String[buffer.length()];

codes=new HuffmanCode[2*buffer.length()-1];

for(int i=0;i2*buffer.length()-1;i++)

codes[i]=new HuffmanCode();

for(int i=0;ibuffer.length();i++){

codes[i].name=buffer.substring(i,i+1);

codes[i].weight=haveNum(buffer.charAt(i),s);

}

getHuffstring();

getCode(2*buffer.length()-2,huffstring,””);

//for(int i=0;icodes.length;i++){

// System.out.println(“”+i+”:”+codes[i].name+codes[i].weight+” “+codes[i].lc+” “+codes[i].rc+” “+codes[i].pa);

//}

for(int i=0;ihuffstring.length;i++){

System.out.println(codes[i].name+” code:”+huffstring[i]);

}

System.out.println(“编码:”+getHuffmanCode(s));

System.out.println(“平均码长为:”+getLength());

}

public double getLength(){

double n=0;

for(int i=0;ibuffer.length();i++){

n+=huffstring[i].length();

}

return n/buffer.length();

}

public String getHuffmanCode(String s){

StringBuffer buf=new StringBuffer();

for(int i=0;is.length();i++){

buf.append(getEachCode(s.substring(i,i+1)));

}

return buf.toString();

}

public String getEachCode(String name){

for(int i=0;ibuffer.length();i++){

if(name.equals(codes[i].name)){

return huffstring[i];

}

}

return “”;

}

public void getCode(int n,String[] thecodes,String thebuffer){

if(nthecodes.length){

thecodes[n]=thebuffer;

return;

}

getCode(codes[n].lc,thecodes,thebuffer+”0″);

getCode(codes[n].rc,thecodes,thebuffer+”1″);

}

public void getHuffstring(){

int[] twos={0,0};

for(int i=buffer.length();i2*buffer.length()-1;i++){

twos=findLastTwo(0,i);

codes[i].lc=twos[0];

codes[i].rc=twos[1];

codes[i].weight=codes[twos[0]].weight+codes[twos[1]].weight;

}

}

public int[] findLastTwo(int start,int end){

double[] weights={1.0,1.0};

int[] t={-1,-1};

for(int i=start;iend;i++){

if(codes[i].pa!=-1)continue;

if(weights[0]codes[i].weight){

weights[0]=codes[i].weight;

t[1]=t[0];

t[0]=i;

}

else if(weights[1]codes[i].weight){

weights[1]=codes[i].weight;

t[1]=i;

}

}

codes[t[0]].pa=end;

codes[t[1]].pa=end;

return t;

}

public double haveNum(char c,String s){

double n=0;

for(int i=0;is.length();i++){

if(c==s.charAt(i))n++;

}

return n/s.length();

}

public static void main (String[] args) {

System.out.print(“输入编码字符串:”);

Scanner sr=new Scanner(System.in);

new Huffman(sr.nextLine());

}

}

到底什么是哈夫曼树啊,求例子

哈夫曼树是给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

例子:

1、将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

2、 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

3、从森林中删除选取的两棵树,并将新树加入森林;

4、重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

扩展资料:

按照哈夫曼编码构思程序流程:

1、切割的顺序是从上往下,直至数组中的元素全部出现在叶节点;

2、我们思路正好相反,从数组中找出最小的两个元素作为最下面的叶节点,在向备选数组中存入这两个叶节点的和(这个新的和加入累加运算,这个和也就是所求的最小值的一部分,原因如上图)。

3、以本题为例,备选数组中现有元素为{30,30},再次取出两个最小元素进行求和,得到新的元素,回归备选数组并记入累加。

4、上述2.3布重复执行直至备选数组中只有一个元素,此时累加结束,返回累加值即可

5、求数组中的最小值,可以用小根堆进行提取最为方便;此题用到了贪心的思路,即用相同的策略重复执行,直至我们得到所需的结果。

参考资料来源:百度百科——哈夫曼树

Java中Huffman问题

这题在实现层面变得和Huffman树没啥关系…

反复取取最小值,使值成为优先级..用优先队列最合适。。可自己把输入方式补上

import java.util.Arrays;

import java.util.PriorityQueue;

public class Test {

   public static void main(String[] args){      

      Integer[] a= {5, 3, 8, 2, 9};

      PriorityQueueInteger q=new PriorityQueueInteger(Arrays.asList(a));

      int cost=0;

      while(q.size()1){

         System.out.println(q); //可删

         int c=q.poll()+q.poll();

         q.offer(c); cost+=c;            

      }

      System.out.println(q); //可删

      System.out.println(cost);      

   }

}

[2, 3, 8, 5, 9]

[5, 5, 8, 9]

[8, 9, 10]

[10, 17]

[27]

59

用java实现哈夫曼编码

只要自己再加个类Tree就可以了。

代码如下:

public class Tree {

double lChild, rChild, parent;

public Tree (double lChild, double rChild, double parent) {

this.lChild = lChild;

this.rChild = rChild;

this.parent = parent;

}

public double getLchild() {

return lChild;

}

public void setLchild(double lChild) {

this.lChild = lChild;

}

public double getRchild() {

return rChild;

}

public void setRchild(double rChild) {

this.rChild = rChild;

}

public double getParents() {

return parent;

}

public void setParents(double root) {

this.parent = root;

}

}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/245644.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:10
下一篇 2024-12-12 13:10

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • Python简单数学计算

    本文将从多个方面介绍Python的简单数学计算,包括基础运算符、函数、库以及实际应用场景。 一、基础运算符 Python提供了基础的算术运算符,包括加(+)、减(-)、乘(*)、除…

    编程 2025-04-29
  • Python满天星代码:让编程变得更加简单

    本文将从多个方面详细阐述Python满天星代码,为大家介绍它的优点以及如何在编程中使用。无论是刚刚接触编程还是资深程序员,都能从中获得一定的收获。 一、简介 Python满天星代码…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29

发表回复

登录后才能评论