ハフマン符号化

私は、データ構造を見ていた(清華大学存在するもの)

 

コーディングの重要性の2ページの説明

私はこの本は、コードの詳細は彼らの練習の一部を達成するために、明確ではなかったと言うでしょう

 

コード

#include <ビット/ STDC ++。H>
名前空間stdを使用。

CONST int型N = 1E3 + 10。
BOOLねじ[N]。
構造体のtypedef
{
	int型の重量;
	int型の親、lchild、rchild。
} HTNode、* HuffmanTree。

ハフマン符号のcharのtypedef **。
= 0になりましたint型。
無効を選択(HuffmanTree&HT、int型CUR、INT&S1、S2のint&、int型のn)
{
	今++;
	int型のval = 1E6;
	、B int型。
	以下のために(int型I = 1; I <= CUR、iは++)
	{
		場合(VIS [i]は)引き続き、使用されていない場合は、//それを使用することができます 
		(HT [I] .weight <val)であれば
		{
			ヴァル= HT [I] .weight。
			= I;
		}
	}
	S1 = A;
    AM [N] = 1。
    
	ヴァル= 1E6;
	以下のために(int型I = 1; I <= CUR、iは++)
	{
		もし(VIS [i])と続けます。
		(HT [I] .weight <val)であれば
		{
			ヴァル= HT [I] .weight。
			B = I;
		}
	}
	S2 = B。
	[B]午前= 1。
	// coutの<<今すぐ<< "" << S1 << "" << S2 <<てendl;
	(> N && B <= n)のスワップ(S1、S2)の場合; //は、一つのリーフノードnを入れなければならない、ということに留意され 
}

void Huffmancoding(HuffmanTree& HT, Huffmancode& HC, int* w, int n)
{
	if (n <= 1) return;
	int m = 2 * n - 1;
	HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));//0号不用
	
	int i;
	for (i = 1; i <= n; ++i)
	HT[i] = { w[i],0,0,0 };
    
	for (; i <= m; ++i)
		HT[i] = { 0,0,0,0 };

	for (i = n + 1; i <= m; ++i)
	{
		int s1, s2;
		Select(HT, i - 1, s1, s2,n);//书上没写这个函数, 
		HT[s1].parent = i, HT[s2].parent = i;
		//统一把小的放在左边,书上的不一致p148那个图有问题 
		HT[i].lchild = s1, HT[i].rchild = s2;
		HT[i].weight = HT[s1].weight + HT[s2].weight;
	}
	//从叶子结点到根逆向求每个字符的哈夫曼编码
	//分配n个字符编码的头指针向量
	HC = (Huffmancode)malloc((n + 1) * sizeof(char*));
	//分配求编码的工作空间
	char* cd = (char *)malloc(n * sizeof(char));
	cd[n - 1] ='\0';

	int cur, f,start;
	for (i = 1; i <= n; i++)
	{
		int cnt = n - 1;
		//cout << i << endl;
		for (cur = i, f = HT[i].parent; f != 0; cur = f, f = HT[f].parent)
		{
		//	cout << f << " ";
			if (HT[f].lchild == cur) cd[--cnt] = '0';
			else cd[--cnt] = '1';
		}
		//puts("");
		HC[i] = (char *)malloc((n - cnt) * sizeof(char));
		strcpy(HC[i],&cd[cnt]);//从cnt这个地方开始复制 
	}
	free(cd);
}

int main()
{
	int n;
	int a[100];
	memset(vis,0,sizeof(vis)); 
	HuffmanTree HT;
	Huffmancode HC;
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	Huffmancoding(HT, HC, a, n);
	for (int i = 1; i <= n; i++)
	{
		cout << i << " " << a[i] << " " << HC[i] << endl;
	}
	return 0;
}
//8
//5 29 7 8 14 23 3 11

  

おすすめ

転載: www.cnblogs.com/mch5201314/p/11680331.html