【中国大学MOOC】算法设计与分析-贪心策略-霍夫曼编码问题-Java

1. 问题描述:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 核心思想

提出贪心策略——证明策略正确

3. 算法伪代码

核心算法

在这里插入图片描述

3. Java代码实现

// huffMan Algorithm

import com.sun.source.tree.Tree;

import java.util.ArrayList;
import java.util.Objects;

class TreeNode{
    TreeNode left;
    TreeNode right;
    int val;
    TreeNode() {}
    TreeNode(int val) {this.val = val;}
    TreeNode(int val, TreeNode left, TreeNode right){
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

public class huffMan {
    public static void main(String[] args){
        int[] input = {45,13,12,16,9,5};
        quickSortT(input, 0, input.length-1);
        ArrayList<TreeNode> P = new ArrayList<TreeNode>();
        ArrayList<TreeNode> Q = new ArrayList<TreeNode>();
        for (int value : input) {
            P.add(new TreeNode(value, null, null));
        }
        for(int i=0; i<input.length-1; i++){
            TreeNode z = new TreeNode();
            TreeNode x = extraceMin(P, Q);
            TreeNode y = extraceMin(P, Q);
            z.val = x.val + y.val;
            z.left = x;
            z.right = y;
            Q.add(z);
        }
        System.out.println(Objects.requireNonNull(extraceMin(P, Q)).val);

    }

    private static TreeNode extraceMin(ArrayList<TreeNode> P, ArrayList<TreeNode> Q){
        if(P.size() == 0 && Q.size()==0){
            return null;
        }
        TreeNode result = new TreeNode();
        if(P.size()>0){
            result.val = P.get(0).val;
        }else{
            result.val = Q.get(0).val;
        }

        for (TreeNode treeNode : P) {
            if (result.val > treeNode.val) {
                result = treeNode;
            }
        }
        for(TreeNode treeNode : Q){
            if(result.val > treeNode.val){
                result = treeNode;
            }
        }
        for(int i=0; i<P.size(); i++){
            if(result.val == P.get(i).val){
                P.remove(i);
                return result;
            }
        }
        for(int i=0; i<Q.size(); i++){
            if(result.val == Q.get(i).val){
                Q.remove(i);
                return result;
            }
        }
        return result;
    }

    // 从小到大 快速排序
    private static void quickSortT(int[] A, int start, int end){
        int i = start;
        int j = end;
        if(start < end){
            int tmp = A[start];
            while(i<j){
                while(i<j && tmp <= A[j]){
                    j--;
                }
                A[i] = A[j];
                while(i<j && tmp >= A[i]){
                    i++;
                }
                A[j] = A[i];
            }
            A[i] = tmp;
            quickSortT(A, start, i-1);
            quickSortT(A, i+1, end);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值