ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

哈夫曼编码实现

2019-10-15 20:51:30  阅读:244  来源: 互联网

标签:编码 typedef 哈夫曼 实现 代码 HT int HuffmanTree now


我是看着数据结构(清华大学那本)

 

这两页说明了编码方式的重要性

我想说的是书上,没说清楚,代码有些实现的细节自己搞了

 

代码

#include<bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;
bool vis[N];
typedef struct
{
	int weight;
	int parent, lchild, rchild;
}HTNode, * HuffmanTree;

typedef char** Huffmancode;
int now = 0;
void Select(HuffmanTree& HT, int cur,int &s1, int &s2,int n)
{
	now++;
	int val = 1e6;
	int a,b;
	for (int i = 1; i <= cur; i++)
	{
		if(vis[i]) continue;//如果用过了就不可以用了 
		if (HT[i].weight < val)
		{
			val = HT[i].weight;
			a = i;
		}
	}
	s1 = a;
    vis[a] = 1;
    
	val = 1e6;
	for (int i = 1; i <= cur; i++)
	{
		if(vis[i]) continue;
		if (HT[i].weight < val)
		{
			val = HT[i].weight;
			b = i;
		}
	}
	s2 = b;
	vis[b] = 1;
	//cout << now << " " << s1 << " " << s2 << endl;
	if(a > n && b <= n ) swap(s1,s2);//这里必须注意,必须把1到 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

  

标签:编码,typedef,哈夫曼,实现,代码,HT,int,HuffmanTree,now
来源: https://www.cnblogs.com/mch5201314/p/11680331.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有