アウトライン
一般に、N個の葉ノードとしてNの重みを与え、ハフマン木のハフマン木を指し、二分木構造、ツリーの加重経路の長さが最小に達した場合、そのようなバイナリツリーが呼び出され、最適なバイナリツリー、およびハフマン木(ハフマン木)と呼ばれます。
ハフマンツリーは、最短経路長加重ツリー、近いルートノードから大きな重みです。
アプリケーション
別のブログで説明するように1ハフマン(コーディングハフマン符号化
構造主義
nは重みがあると仮定し、ハフマン木は、n個のリーフノードで構成されています。n個の重み値をW1、W2に設定されている、...、施工規則はWN、ハフマンツリーは次のとおりです。
(1)W1、W2、...、Wnが(一つだけ存在する各ツリーノード)は、森の木のようにNです。
(2)左右のサブツリー内の新しいツリーとしてフォレスト2つの極小重量ツリーのマージのルートノードを選択し、ツリーが新しい左右のサブツリーのルートへの権利のルートでありますノードの重みの合計。
(3)森林、および新しい森林木の添加から2つのツリーを選択して削除します。
(4)繰り返し(2)、(3)工程のみ木、ハフマン木により得られる木まで森まで。
コードの実装
ノードクラス
public class Node implements Comparable<Node>{
int value;
Node left;
Node right;
public Node(int value) {
this.value = value;
}
@Override
public int compareTo(Node o) {
// TODO Auto-generated method stub
return this.value - o.value; //整体添加负号表示从大到小排序
}
@Override
public String toString() {
//重写toString方法,只显示value值
return "Node [value=" + value + "]";
}
public int getDate() {
// TODO Auto-generated method stub
return this.value;
}
}
ミアン:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestHuffmanTree {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {3,7,8,29,5,11,23,12};
Node node = creatHuffmanTree(arr);
System.out.println(node); //打印出根结点(最小根)
}
//创建赫夫曼树
public static Node creatHuffmanTree(int[] arr) {
//使用数组中的所有元素创建若干个二叉树(只有一个结点)
List<Node> nodes = new ArrayList<>(); //创建二叉树集合
for(int value:arr) {
nodes.add(new Node(value));
}
//循环处理
while(nodes.size() > 1) {
//排序
Collections.sort(nodes);
//取出权值最小的两个二叉树
Node left = nodes.get(nodes.size()-1);
Node right = nodes.get(nodes.size()-2);
//组成一个新的二叉树,根节点权值为两子节点权值之和
Node parent = new Node(left.getDate() + right.getDate());
parent.left = left;
parent.right = right;
//把取出来的两个二叉树移除
nodes.remove(left);
nodes.remove(right);
//将新二叉树放入原来的二叉树集合中
nodes.add(parent);
}
return nodes.get(0);
}
}