huffuman编码

#include "stdafx.h"
#include <iostream>
using namespace std;

typedef struct
{
	int w;
	int p,l,r;
}HNode,*HTree;

typedef char** HCode;

void select(HTree ht,int n,int& s1,int& s2)
{
	int min[2]={1000,1000};
	for(int i=1;i<=n;i++)
	{
		if(ht[i].p==0)
		{
			if(ht[i].w<min[0])
			{
				min[1]=min[0];
				s2=s1;
				min[0]=ht[i].w;
				s1=i;
			}
			else if(ht[i].w<min[1])
			{
				min[1]=ht[i].w;
				s2=i;
			}
			else
			{}
		}
	}
}

void HuffumanCoding(HCode& code,int *w,int n)
{
	int m=2*n-1;

	HTree ht=(HTree)malloc((m+1)*sizeof(HNode));
	memset(ht,0,(m+1)*sizeof(HNode));
	for(int i=1;i<=n;i++)
	{
		ht[i].w=*(w+i-1);
	}

	for(int i=n+1;i<=m;i++)
	{
		int s1,s2;
		select(ht,i-1,s1,s2);

		ht[i].w=ht[s1].w+ht[s2].w;
		ht[i].l=s1;
		ht[i].r=s2;
		ht[s1].p=i;
		ht[s2].p=i;
	}

	code=(HCode)malloc((n+1)*sizeof(char*));

	char* cd=(char*)malloc((n+1)*sizeof(char));
	for(int i=1;i<=n;i++)
	{
		int cnt=0;
		int child=i;
		int p=ht[i].p;
		while(p!=0)
		{
			if(child==ht[p].l)
			{
				cd[cnt++]='0';
			}
			else
			{
				cd[cnt++]='1';
			}
			child=p;
			p=ht[p].p;
		}

		code[i]=(char*)malloc((cnt+1)*sizeof(char));
		code[i][cnt]='\0';
		for(int j=cnt-1;j>=0;j--)
		{
			code[i][cnt-1-j]=cd[j];
		}
	}
	free(cd);
	free(ht);

	return;
}

void showCode(char* ch,HCode code,int n)
{
	for(int i=1;i<=n;i++)
	{
		cout<<ch[i-1]<<":";
		cout<<code[i]<<endl;
	}
}

int  main(void)
{
	char ch[]="12345678";
	int w[]={5,29,7,8,14,23,3,11};
	HCode hc;

	HuffumanCoding(hc,w,8);
	showCode(ch,hc,8);
	system("pause");

	return 0;
}

#include "stdafx.h"
#include <iostream>
using namespace std;

typedef struct
{
	int w;
	int p,l,r;
}HNode,*HTree;

typedef char** HCode;

void select(HTree ht,int n,int& s1,int& s2)
{
	int min[2]={1000,1000};
	for(int i=1;i<=n;i++)
	{
		if(ht[i].p==0)
		{
			if(ht[i].w<min[0])
			{
				min[1]=min[0];
				s2=s1;
				min[0]=ht[i].w;
				s1=i;
			}
			else if(ht[i].w<min[1])
			{
				min[1]=ht[i].w;
				s2=i;
			}
			else
			{}
		}
	}
}

void HuffumanCoding(HCode& code,int *w,int n)
{
	int m=2*n-1;

	HTree ht=(HTree)malloc((m+1)*sizeof(HNode));
	memset(ht,0,(m+1)*sizeof(HNode));
	for(int i=1;i<=n;i++)
	{
		ht[i].w=*(w+i-1);
	}

	for(int i=n+1;i<=m;i++)
	{
		int s1,s2;
		select(ht,i-1,s1,s2);

		ht[i].w=ht[s1].w+ht[s2].w;
		ht[i].l=s1;
		ht[i].r=s2;
		ht[s1].p=i;
		ht[s2].p=i;
	}

	code=(HCode)malloc((n+1)*sizeof(char*));

	char* cd=(char*)malloc((n+1)*sizeof(char));
	char*pcd=cd;
	int cdlen=0;
	for(int i=1;i<=m;i++)
	{
		ht[i].w=0;
	}
	int p=m;
	while(p)
	{
		if(ht[p].w==0)
		{
			ht[p].w=1;
			if(ht[p].l!=0)
			{
				*pcd++='0';
				cdlen++;
				p=ht[p].l;
			}
			else if(ht[p].r==0)
			{
				*pcd='\0';
				code[p]=(char*)malloc((cdlen+1)*sizeof(char));
				strcpy(code[p],cd);
			}
			else
			{}
		}
		else if(ht[p].w==1)
		{
			ht[p].w=2;
			if(ht[p].r!=0)
			{
				*pcd++='1';
				cdlen++;
				p=ht[p].r;
			}
		}
		else
		{
			ht[p].w=0;
			p=ht[p].p;
			pcd--;
			cdlen--;
		}
	}

	free(cd);
	free(ht);

	return;
}

void showCode(char* ch,HCode code,int n)
{
	for(int i=1;i<=n;i++)
	{
		cout<<ch[i-1]<<":";
		cout<<code[i]<<endl;
	}
}

int  main(void)
{
	char ch[]="12345678";
	int w[]={5,29,7,8,14,23,3,11};
	HCode hc;

	HuffumanCoding(hc,w,8);
	showCode(ch,hc,8);
	system("pause");

	return 0;
}

时间: 2024-10-25 11:26:32

huffuman编码的相关文章

huffuman 编码

1 #include "stdafx.h" 2 #include <iostream> 3 #include<queue> 4 #include<vector> 5 #include <string> 6 7 using namespace std; 8 9 typedef struct 10 { 11 //内容 12 unsigned char character; 13 //频次 14 unsigned int frequency;

word2vec的数学原理(二)——基于huffuman softmax

一.W2V的两种模型:CBOW和Skip-gram W2V有两种模型,分别为CBOW和skip-gram,CBOW是根据上下文$context(w)$来预测中间词$w$,而skip-gram是根据中间词$w$来预测上下文$context(w)$:他们都有3层结构--输入层,投影层,输出层.(注:无隐藏层) 二.基于huffuman的CBOW  1.网络结构 CBOW的网络机构有3层,分别为输入层,投影层,输出层:以样本$(context(w),w)$为例,做简要说明. 输入层:上下文的2c个词的

C语言 &#183; Huffuman树

基础练习 Huffuman树 时间限制:1.0s   内存限制:512.0MB 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中.这个过程的费用记为pa + pb. 2. 重复步骤1,直到{pi}中只剩下一个数. 在上面的操作过程中,把所有

[BASIC-28] Huffuman树

基础练习 Huffuman树 时间限制:1.0s   内存限制:512.0MB 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中.这个过程的费用记为pa + pb. 2. 重复步骤1,直到{pi}中只剩下一个数. 在上面的操作过程中,把所有

Python中编码的详细讲解

看这篇文章前,你应该已经知道了为什么有编码,以及编码的种类情况 ASCII 占1个字节,只支持英文 GB2312 占2个字节,支持6700+汉字 GBK GB2312的升级版,支持21000+汉字 Shift-JIS 日本字符 ks_c_5601-1987 韩国编码 TIS-620 泰国编码 由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,即:仅涵盖本国字符,无其他国家字符的对应关系.应运而生出现了万国码,他涵盖了全球所有的文字和二进制的对应关系, U

java编码规范

右括号") "与其后面的关键字之间,关键字与其后面的左括号"("或"{"之间,以及"}"与"{"之间,要以一个空格隔开:除". "外,所有二元操作符的前.后要加空格:在逗号后边加一个空格. 说明: 一个紧跟着括号的关键词应该被空格分开: 空白应该位于参数列表中逗号的后面: 所有的二元运算符,除了".",应该使用空格将之与操作数分开.一元操作符和操作数之间不应该加空格,

微信实现定位城市并获取城市编码

最近在做一个项目是将用户的当前所在市县定位出来并展示在手机端页面,同时还要获取到该市县的城市编码从而进行数据过滤,这里重点讲定位城市及获取城市编码 前端页面代码: 首先引用腾讯地图的一个js <script type="text/javascript" src="https://3gimg.qq.com/lightmap/components/geolocation/geolocation.min.js" ></script> 同时在页面加载

python字符编码

1. 字符编码简介 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符 ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符) 后来为了将拉丁文也编码进了ASCII表,将最高位也占用了 阶段二:为了满足中文,中国人定制了GBK GBK:2Bytes代表一个字符 为了满

刨根究底字符编码之十二——UTF-8究竟是怎么编码的

UTF-8究竟是怎么编码的 1. UTF-8编码是Unicode字符集的一种编码方式(CEF),其特点是使用变长字节数(即变长码元序列.变宽码元序列)来编码.一般是1到4个字节,当然,也可以更长. 为什么要变长呢?这可以理解为按需分配,比如一个字节足以容纳所有的ASCII码字符,那何必补一堆0用更多的字节来存储呢? 实际上变长编码有其优势也有其劣势,优势是节省空间.自动纠错性能好.利于传输.扩展性强,劣势是不利于程序内部处理,比如正则表达式检索:而UTF-32这样等长码元序列(即等宽码元序列)的