哈夫曼编码
来源:互联网 发布:学格斗的软件 编辑:程序博客网 时间:2024/06/15 17:27
#include "Huffman.h"void Huffman(float *data,int len){int num,i;num=2*len-1;//总结点是叶子结点的2倍少一个HuffmanNode *head=(HuffmanNode*)malloc(num*sizeof(HuffmanNode));for (i=0;i<len;i++){head[i].weight=data[i];head[i].parent=0;head[i].lchild=0;head[i].rchild=0;}//初始化 for (i=len;i<num;i++) { head[i].weight=10000; head[i].parent=0; head[i].lchild=0; head[i].rchild=0; } for (i=len;i<num;i++) { Selectnode(head,i); } printf("节点号:权重 \t父节点\t左孩子\t右孩子\n"); for ( i=0;i<num;i++) { printf("%d: %f\t%d\t%d\t%d\n",i,head[i].weight,head[i].parent,head[i].lchild,head[i].rchild); } }void Selectnode(HuffmanNode *head,int len){int min1,min2,i;//找出集合中最小的两个for ( i=0;i<len;i++){if(head[i].parent==0){min1=i;}}for ( i=0;i<len;i++){if(head[i].parent==0&&min1!=i){min2=i;}}for ( i=0;i<len;i++){if(head[i].parent==0){ if (head[min1].weight>head[i].weight&&min2!=i) { min1=i; } if (head[min2].weight>head[i].weight&&i!=min1) { min2=i; }}} //将新的节点填入 head[min1].parent=len;head[min2].parent=len;head[len].lchild=min1;head[len].rchild=min2;head[len].weight=head[min1].weight+head[min2].weight;}
1.重点在其存储结构,用顺序表比较好。
#include <MALLOC.H>#include <stdio.h>struct HuffmanNode { float weight;//比重 int parent;//父节点 int rchild;//右孩子 int lchild;//左孩子};void Selectnode(HuffmanNode *head,int len);//选择2个最小的加入顺序表HEAD中void Huffman(float *data,int len);//哈夫曼编码
2.缺点:找最小两个的时候,应该用堆排序比较好。
0 0
- 信源编码---哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 黑马程序员——Java网络编程(TCP和UDP)
- Merge Sorted Array
- 最长递增子序列
- 深度学习研究组
- Recently2
- 哈夫曼编码
- 单例模式笔记介绍
- HDU 4279 Number(找规律)
- 出现( linker command failed with exit code 1)错误总结
- Slider网站欣赏
- lucene简介
- Fedora 安装chrome浏览器的方法<>
- 黑马程序员—正则表达式概念
- 技术人生 迟到的起航