一步一步写算法(之哈夫曼编码)

哈夫曼树也称最优二叉树,顾名思义,即所有叶子结点的带权路径长度最短。对数据进行哈夫曼编码,可以大大减少数据传输量。

1.设计Huffman Tree的结点结构,即Huffman Node,并创建Huffman Node

//huffman节点结构
typedef struct _HUFFMAN_NODE{
	char str;	//需编译的字符
	double frequence;	//字符出现频率
	int symbol;	//该节点的编码
	_HUFFMAN_NODE *left;
	_HUFFMAN_NODE *right;
	_HUFFMAN_NODE *parent;
}HUFFMAN_NODE;

//创建HUFFMAN_NODE
HUFFMAN_NODE *creat_huffman_node(char str,double frq)
{
	HUFFMAN_NODE *pNode;
	pNode=(HUFFMAN_NODE *)malloc(sizeof(HUFFMAN_NODE));
	
	assert(NULL!=pNode);
	pNode->str = str;
	pNode->frequence = frq;
	pNode->left = NULL;
	pNode->right = NULL;
	pNode->parent = NULL;
	pNode->symbol = -1;
	
	return pNode;
}


2.创建Huffman Tree

//创建huffman_Tree
HUFFMAN_NODE *creat_huffman_tree(HUFFMAN_NODE *array[],int len)
{
	HUFFMAN_NODE *root;

	while(len>1){
		root=(HUFFMAN_NODE *)malloc(sizeof(HUFFMAN_NODE));
		assert(NULL!=root);
		bubble_sort(array,len);
		root->left = array[0];
		root->right = array[1];
		root->frequence = array[0]->frequence + array[1]->frequence;
		array[0]->symbol = 1;
		array[0]->parent = root;
		array[1]->symbol = 0;
		array[1]->parent = root;
		
		memmove(&array[0],&array[2],sizeof(HUFFMAN_NODE *)*(len-2));
		array[len-2]=root;
		len--;
	}

	return root;

}


3.输出huffman编码

//输出huffman_code
void print_huffman_code(HUFFMAN_NODE *pNode,HUFFMAN_NODE *root)
{
	assert(NULL!=root);
	
	printf("%c: %f ",pNode->str,pNode->frequence);
	while(pNode!=root){
		printf("%d",pNode->symbol);
		pNode=pNode->parent;
	}
	printf("\n");
}

其中bubble_sort()的函数原型如下:

int compare(void *a,void *b)
{
	HUFFMAN_NODE *node1=(HUFFMAN_NODE *)a;
	HUFFMAN_NODE *node2=(HUFFMAN_NODE *)b;

	return node1->frequence>node2->frequence?1:0;
}


void swap(HUFFMAN_NODE **a,HUFFMAN_NODE **b)
{
	HUFFMAN_NODE *tmp;

	tmp=*a;
	*a=*b;
	*b=tmp;
}

void bubble_sort(HUFFMAN_NODE *array[],int len)
{
	int inner,outer;

	for(outer=0;outer<len-1;outer++){
		for(inner=0;inner<=outer;inner++)
			if(compare(array[inner],array[inner+1]))
				swap(&array[inner],&array[inner+1]);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值