永发信息网

求完整的哈弗曼编码的java算术代码

答案:1  悬赏:0  手机版
解决时间 2021-11-20 18:01
求完整的哈弗曼编码的java算术代码
最佳答案
书上不是有吗。。。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Huffman {
    private List nums;
    private List numsMo;
    private List trees;
    private String temp;

    public Huffman() {
        nums = new ArrayList();
        numsMo = new ArrayList();
        trees = new ArrayList();
        temp = "";
    }

    public void addNums() {// 给定一组数
        System.out.println("请输入一组数,中间用空格分隔:");
        Scanner sca = new Scanner(System.in);
        String str = sca.nextLine();
        String[] strs = str.split(" ");
        for (int i = 0; i < strs.length; i++) {
            nums.add(Double.parseDouble(strs[i]));
            numsMo.add(Double.parseDouble(strs[i]));
        }
    }

    public void compareNum(List nums, List trees) {// 递归算法
        double[] min = new double[2];
        if (nums.size() > 1) {
            min = minTwo(nums);
            Tree t = new Tree(min[0], min[1], min[0] + min[1]);
            nums.remove(Double.valueOf(min[0]));
            nums.remove(Double.valueOf(min[1]));
            nums.add(min[0] + min[1]);
            trees.add(t);
            compareNum(nums, trees);
        }
    }

    public void print(double num) {// 递归打印编码
        for (Tree t : trees) {
            if (num == t.getRchild()) {
                temp = 1 + temp;
                print(t.getParents());
                break;
            } else if (num == t.getLchild()) {
                temp = 0 + temp;
                print(t.getParents());
                break;
            }
        }
    }

    public void write(double d) {
        temp = "";
        System.out.print(d + " : ");
        print(d);
        System.out.print(temp);
        System.out.println(" 码长:" + temp.length());
    }

    public double[] minTwo(List nums) {// 在一组数中选则最小的两个,按递增排序返回
        Double temp = 0.0;
        for (int j = 0; j < 2; j++) {
            for (int i = 1; i < nums.size(); i++) {
                if (nums.get(i - 1) < nums.get(i)) {
                    temp = nums.get(i);
                    nums.set(i, nums.get(i - 1));
                    nums.set(i - 1, temp);
                }
            }
        }
        double[] n = { nums.get(nums.size() - 1), nums.get(nums.size() - 2) };
        return n;
    }

    public void start() {
        addNums();
        compareNum(nums, trees);
        while (numsMo.size() > 1) {
            double[] mins = minTwo(numsMo);
            if (mins[0] != mins[1]) {
                numsMo.remove(Double.valueOf(mins[0]));
                write(mins[0]);
            }
        }
        if (!numsMo.isEmpty()) {
            write(numsMo.get(0));
        }
    }

    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;
        }

    }

    public static void main(String[] args) {
        new Huffman().start();
    }
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
请教下,3M CL66X 投影仪如何清零,急等
集成光学是做什么的?
润滑油三芯地址有知道的么?有点事想过去!
眼球疼是怎么回事
御捷330电动汽车改装什么可以续航里程长
倍耐力轮胎255/40一18R99Y与255/40一
为什么镜子里看起来嫩嫩的美人,照相出来就又
宏业汽修(泰州高港区扬子江北路19)地址在什么
一个女孩问你你心目中的她是一位什么样的人呢
北京怀柔开会农村限行么
伏牛山国家级自然保护区的区域范围
再好的姐妹知己久没连续感情慢慢淡了
蒋冰禅出轨了吗,孟雨泽二次出轨,出轨的代价
65□120≈65万□里最大填几
公正该如何是好
推荐资讯
8寸和 10.4寸屏幕的尺寸大小(长宽各多少毫
“惰”换偏旁组新字
淘宝买个三刀轮山地车代步上下班危险不,有些
林峰是否真的整容?他人好不好啊?
求这种二次元字体apk格式的
请问日式cjs烫发是什么?
柬埔寨语好学吗?
新京报记者电话
普通电视或显示器能否改造3D圆偏光显示器?
写一个shell脚本,将输入的字符串反转过来显
飞歌76系列分高配和低配吗
我不想做装修了,想去进点水果卖,
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?