貪欲アルゴリズム(最適化問題の解決)とそのアプリケーションハフマンコーディング

1.貪欲なアルゴリズムソリューションプロセス:
通常はトップダウン設計:選択を行い(ローカルで最適な選択を行い)、元の問題と同様に残りのサブ問題を解決します。
ここに画像の説明を挿入
2.貪欲なアルゴリズムの設計手順:
ここに画像の説明を挿入
3. 0-1ナップザック問題とスコアナップザック問題:
0-1ナップザック問題:[動的プログラミング] 01ナップザック問題(理解しやすい、超基本的な説明)
スコアナップザック問題:貪欲なアルゴリズム、アルゴリズムを参照はじめにセクション16.2

4.ハフマン符号化:目標:文字の頻度が高く、2進数の数が少ない
文字などのデータの場合、出現頻度に応じて、文字の最適なプレフィックスコード(バイナリ表現)は、ハフマンの貪欲アルゴリズムによって構築され、占有スペースが削減されます。
プレフィックスコード:他のコードワードのプレフィックスとなるコードワードはありません。
最適なプレフィックスコードに対応するツリーには、N個のリーフノード(文字数)があり、正確にN-1個の内部ノードがあります。

4.1。ハフマンバイナリコーディング構築プロセス:
a)アルゴリズムは、Nリーフノードから始めて、ボトムアップで最適なコーディングに対応するバイナリツリーTを構築し、N-1マージ操作を実行して最終的なバイナリツリーを作成します。
b)アルゴリズムは、文字の出現頻度をキーワードとして持つ最小の優先度キューQを使用して、頻度が最も低い2つのオブジェクトを識別し、それらをマージします
。c)2つのオブジェクトをマージしたときに取得される新しいオブジェクトの頻度は、2つの元のオブジェクトの頻度の合計に設定されます。
フローチャートは次のとおり
ここに画像の説明を挿入
です:
4.2。C ++コードを構築するためのハフマンバイナリコーディング:特定の文字とその出現頻度が構造の配列を形成すると仮定しますnodeArr

#include <queue>
struct node{
    
    
	int num; // 字符出现频率
	char c; //字符
	node* left;
	node* right;
	node(int x,char y):num(x),c(y),left(null),right(null){
    
    }
	node():num(0),c('0'),left(null),right(null){
    
    }
	bool operator< (const node& a){
    
    
		return num>a.num; //从小到大排列
	}
}
node* nodeArr[10]; // 假设已经给定,且存储在动态内存

priority_queue<node*> q; // 按字符出现频率由小到大排列
for(int i = 0;i<10;i++){
    
    
	q.push(nodeArr[i]);
}
for(int i = 0;i<9;i++){
    
     // 10个节点9条边
	node* z = new node;
	node* tmp1 = q.front();
	q.pop();
	node* tmp2 = q.front();
	q.pop();
	z->left = tmp1;
	z->right = tmp2;
	z->num = tmp1->num +tmp2->num;
	q.push(z);
}
node* root =  q.front(); //树的根节点

総括する:

1.ハフマンコーディングを構築するプロセスで、左のノードを低周波数で配置し、右のノードを高周波数で配置します。
2.ハフマン符号化は、少数のバイナリビットを使用して文字を高頻度で表すため、使用されるスペースが削減され、圧縮符号化が実現されます。

おすすめ

転載: blog.csdn.net/qq_33726635/article/details/106001138