ハフマン符号化された
データは、それによって元のデータを圧縮し、出現頻度データに基づいて符号化されます。
たとえば、次のように様々な文字の数が表示されるテキストファイル、:
:10
B:20
C:40
D:80
各文字は00で変換し、例えば、バイナリ符号に変換することができるBは01に変換され、Cは10に変換され、Dは11に変換されます。これは、各文字(出現頻度)の重量を考慮せずに、符号化の最も単純な方法です。用途に貪欲なストラテジをハフマン符号化は、最も頻度の高い文字は、このように符号化最短の全体の長さを確保し、最短をコードします。
最初は、各周波数は、それらの親ノードとして新しいノードと新しいノードと二つのノードのための周波数を発生するために、少なくとも2つのノードを選択ハフマンツリー生成プロセスを生成します。下層のツリーの選択された最初のノードは、その後、所望のコード長が総符号長が小さくすることができることは、あまり頻繁にそうであるような最小の周波数選択理由生成プロセス。
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
public class hufman {
private class Node implements Comparable<Node>{
char ch;
int frequency;
boolean isleaf;
Node left;
Node right;
public Node(char a,int f) {
ch=a;
frequency=f;
isleaf=true;
}
public Node(Node left,Node right,int frequency) {
this.left=left;
this.right=right;
this.frequency=frequency;
}
@Override
public int compareTo(Node o) {
// TODO Auto-generated method stub
return this.frequency-o.frequency;
}
}
public Map<Character,String> encode(Map<Character,Integer> frquencyChar){
PriorityQueue<Node> p=new PriorityQueue();
for(char c:frquencyChar.keySet()) {
p.add(new Node(c,frquencyChar.get(c)));
}
while(p.size()!=1) {
Node n1= p.poll();
Node n2= p.poll();
p.add(new Node(n1,n2,n1.frequency+n2.frequency));
}
return Encode(p.poll());
}
public Map<Character,String> Encode(Node root){
Map<Character,String> m=new HashMap();
Encode(root,"",m);
return m;
}
public void Encode(Node node,String a,Map<Character,String> m) {
while(node.isleaf) {
m.put(node.ch, a);
return;
}
Encode(node.left,a+"0",m);
Encode(node.right,a+"1",m);
}
}
man.java
import java.util.HashMap;
import java.util.Map;
public class Teat {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map <Character,Integer> frquencyChar=new HashMap();
frquencyChar.put('a', 1);
frquencyChar.put('c', 19);
frquencyChar.put('2', 13);
frquencyChar.put('5', 14);
hufman a=new hufman();
Map<Character,String> b=a.encode(frquencyChar);
for(char m:b.keySet()) {
System.out.println(m+b.get(m));
}
}
}
これは、大きなルートヒープので、NodeオブジェクトのcompareTo関数を書き換え、同等インタフェース、継承
マップの添加量の最初の文字を、Iは最小可視毎に小根の構造は、ヒープことが理解されます。このように構成されたノードを合計します。
機能を書き換えた後、私たちは、私は0、交換する」必要があると思います。この機能比較<0なし交換を、this.fre-o.fre> 0 SMALLは後発交換されます。
PriorityQueue <Integer> maxHeap = new PriorityQueue<Integer>( new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2.compareTo(o1);
}
});
大きなルートヒープはまた、この書き換えのような小さな根ヒープで変換することができます。
https://blog.csdn.net/liou825/article/details/21322403
https://blog.csdn.net/zcf1784266476/article/details/68961473