Huffman树创建(基于循序存储)以及基于Huffman树的编码

该博客详细介绍了如何使用哈夫曼树进行数据编码。首先,通过创建基于顺序存储的HuffmanTreeArrayNode类来构建Huffman树,接着利用权重最小的节点合并策略填充树结构。然后,通过遍历树结构生成每个节点的Huffman编码。最后,展示了如何根据构建的Huffman树生成对应的编码映射,以便于高效的数据压缩和传输。
摘要由CSDN通过智能技术生成
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class HuffmanTree<T> {
    private HuffmanTreeArrayNode<T>[] huffmanTree;

    public void createHuffmanTree(List<HuffmanTreeArrayNode<T>> leafNodes){//创建基于顺序存储的Huffman树
        int leafCount = leafNodes.size();
        huffmanTree = new HuffmanTreeArrayNode[2*leafCount-1];
        int treeIndex = 0;
        for (HuffmanTreeArrayNode<T> node: leafNodes) {
            huffmanTree[treeIndex++] = node;
        }
        for (int i = leafCount; i < huffmanTree.length; i++) {
            double min1 , min2;
            min1 = min2 =  Double.MAX_VALUE;
            int min1Index , min2Index;
            min1Index = min2Index = 0;
            for (int j = 0; j < leafCount; j++) {
                if (huffmanTree[j].getParent()==-1){
                    if (huffmanTree[j].getWeight()<min1){
                        min2 = min1;
                        min2Index = min1Index;
                        min1 = huffmanTree[j].getWeight();
                        min1Index = j;
                    }else if (huffmanTree[j].getWeight()<min2){
                        min2 = huffmanTree[j].getWeight();
                        min2Index = j;
                    }
                }
            }
            huffmanTree[min1Index].setParent(leafCount);
            huffmanTree[min2Index].setParent(leafCount);
            huffmanTree[i] = new HuffmanTreeArrayNode<>(min1+min2);
            huffmanTree[i].setLeftChild(min1Index);
            huffmanTree[i].setLeftChild(min2Index);
        }
    }

    public Map<T,String> buildHuffmanCodes(){//基于Huffman树的Huffman编码
        int leafCount = (huffmanTree.length+1)/2;
        Map<T,String> codes = new HashMap<>();
        for (int i = 0; i < leafCount; i++) {
            String code = "";
            int parentIndex = huffmanTree[i].getParent();
            while (parentIndex!=-1){
                if (i == huffmanTree[parentIndex].getLeftChild()){
                    code = 0 + code;
                }else {
                    code = 1 + code;
                }
                parentIndex = huffmanTree[parentIndex].getParent();
            }
            codes.put(huffmanTree[i].getData(),code);
        }
        return codes;
    }
}
class HuffmanTreeArrayNode<T>{
    private T data;
    private double weight;
    private int leftChild = -1;
    private int rightChild = -1;
    private int parent = -1;

    public HuffmanTreeArrayNode(double weight) {
        this.weight = weight;
    }

    public HuffmanTreeArrayNode(T data, double weight) {
        this.data = data;
        this.weight = weight;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public int getLeftChild() {
        return leftChild;
    }

    public void setLeftChild(int leftChild) {
        this.leftChild = leftChild;
    }

    public int getRightChild() {
        return rightChild;
    }

    public void setRightChild(int rightChild) {
        this.rightChild = rightChild;
    }

    public int getParent() {
        return parent;
    }

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

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值