ハフマン符号化ツリー

すべてのデータ構造、アルゴリズムやアプリケーションカリキュラムのテンプレートをクリックしてください:https://blog.csdn.net/weixin_44077863/article/details/101691360

ハフマン木は、n外部ノードとバイナリツリー拡張の最小要件であり、WPL

この拡張は、バイナリツリーの葉空の拡張ではなく、オリジナルのnノードへの空気根の膨張は、空の葉と言うことです

WPL =ΣのWi * Liは、WPLは、経路長のリーフノード加重和を指し、合計は距離のルートを右点乗算され

アイデアは非常に単純なアルゴリズムであります

①遠く離れルートからになる権利近い、小さくも大きくなるようにルートから右

②リーフノードまで根が直接使用することができ、つまり、このルートのようにカウントアップを追加していき、根を合成するために一緒に右のポイントに、その後、この時点で右の増加に再び2つのノードまで行かなかった見つけます合成を行うために継続するため、このようなルートノード

だから、非常に単純な実装するとき

ポイントの束

2つの合成最小サブツリーを取り、ルートノードは、彼の息子の和であり、その後、バックサブツリーパイルポイントへ

これは、このポイントの杭と一点は、判断を下すために、他のポイントへのサブツリーのルートとして見ることができます

それとも、完全なツリーを閉じるまで、この操作を繰り返し、2つの一緒ルックを選出

たとえば、次のように

ハフマン木は、その後トークアプリケーションで、メッセージの暗号化の様相のために使用され、2進数の文字を表現します

どちらのあいまいさを表現作る、それが最短です

そして、周波数は、ハフマン木をすることができ構築するために簡単で、我々はバイナリ文字列、非常に単純な、それの例を見て書き出す文字に左右0 1対応を使用しました

ここでは、ハフマン木の成果のテンプレートコードを与え、基本的な操作の残りの部分は書いていません

一つのことは、n個のノードを見ているのn-1のマージに次男ツリー、よく理解する必要が言うのを忘れ、言うことはありません。

template <class T>
class Node{
public:
	T x;
	Node<T> *l,*r,*pa;
	Node():l(0),r(0),pa(0){}
	Node(T x,Node<T> *l=0,Node<T> *r=0,Node<T> *pa=0):x(x),l(l),r(r),pa(pa){}
};
template <class T>
class cmp{//注意如果堆里是对指针排序的话,Node里重载小于号就不好用了,你就必须得写cmp了 
public:
	bool operator()(Node<T> *a,Node<T> *b){
		return a->x>b->x;
	}
};
template <class T>
class HuffmanTree
{
private:
	Node<T>* root;                               //Huffman树的树根
public:	
	HuffmanTree(T w[], int n);
	void merge(Node<T> *a,Node<T> *b,Node<T>* pa);
};
template<class T>
void HuffmanTree<T>::merge(Node<T> *a,Node<T> *b,Node<T>* pa){
	pa->x=a->x+b->x;
	pa->l=a;
	pa->r=b;
	a->pa=pa;
	b->pa=pa;
}
template<class T>
HuffmanTree<T>::HuffmanTree(T w[], int n){
	priority_queue<Node<T>*,vector<Node<T>*>,cmp<T>> q;
	Node<T> *pa,*a,*b,*tmp;
	for(int i=0;i<n;i++){
		tmp=new Node<T>(w[i]);
		q.push(tmp);
	}
	for(int i=0;i<n-1;i++){
		a=new Node<T>;
		b=new Node<T>;
		pa=new Node<T>;
		a=q.top();q.pop();
		b=q.top();q.pop();
		merge(a,b,pa);
		q.push(pa);
		root=pa;
	}
}

 

公開された49元の記事 ウォンの賞賛0 ビュー1706

おすすめ

転載: blog.csdn.net/weixin_44077863/article/details/103181700
おすすめ