当前位置: 首页 > news >正文

耒阳网站建设/网络推广工作内容

耒阳网站建设,网络推广工作内容,好的网站域名,山东省城乡建设部网站首页带权路径最小的二叉树称为最优二叉树或Huffman&#xff08;哈夫曼树&#xff09;。 Huffman树的构造 将节点的权值存入数组中&#xff0c;由数组开始构造Huffman树。初始化指针数组&#xff0c;指针指向含有权值的孤立节点。 b malloc(n*sizeof(BTreeNode)); for (i 0; i <…

带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树)。

Huffman树的构造

将节点的权值存入数组中,由数组开始构造Huffman树。初始化指针数组,指针指向含有权值的孤立节点。

b = malloc(n*sizeof(BTreeNode));
for (i = 0; i < n; i++)     {b[i] = malloc(sizeof(BTreeNode));b[i]->data  = a[i];b[i]->left  = NULL;b[i]->right = NULL;
}

数组b中的指针可以理解为二叉树的根指针。

进行n - 1次循环建立Huffman树

选择b中根节点权值最小的两棵二叉树作为左右子树组成新的二叉树,新二叉树的根节点权值为两颗二叉树根节点权值的和。

将新二叉树添加到b中,并从b中删除原来的两棵二叉树。当b中只有一棵树时终止循环。

int k1 = -1, k2;
for (j = 0; j < n; j++)
//让k1初始指向森林中第一棵树,k2指向第二棵
{if (b[j] != NULL && k1 == -1){k1 = j;continue;}if (b[j] != NULL){k2 = j;break;}
}
for (j = k2; j < n; j++)
//从当前森林中求出最小权值树和次最小权值树
{if (b[j] != NULL){if (b[j]->data < b[k1]->data){k2 = k1;k1 = j;}else if (b[j]->data < b[k2]->data)k2 = j;}
}
//由最小权值树和次最小权值树建立一棵新树,q指向树根结点
q = malloc(sizeof(BTreeNode));
q->data = b[k1]->data + b[k2]->data;
q->left = b[k1];
q->right = b[k2];b[k1] = q;//将指向新树的指针赋给b指针数组中k1位置
b[k2] = NULL;//k2位置为空

Huffman编码与解码

首先给出求带权路径的递归实现:

double WeightPathLength(BTreeNode* FBT, int len) { //len = 0if (FBT == NULL) {//空树返回0return 0;}else{if (FBT->left == NULL && FBT->right == NULL)//访问到叶子结点return FBT->data * len;else //访问到非叶子结点,进行递归调用,返回左右子树的带权路径长度之和,len递增return WeightPathLength(FBT->left,len+1)+WeightPathLength(FBT->right,len+1);}
}

上述算法实际上通过双递归遍历了Huffman树。

改进上述算法得到求哈夫曼编码的实现:

static int index = 0;
char *c;
void HuffManCoding(FILE *fp, BTreeNode* FBT, int len)//len初始值为0
{static int a[10];//定义静态数组a,保存每个叶子的编码,数组长度至少是树深度减一if (FBT != NULL)//访问到叶子结点时输出其保存在数组a中的0和1序列编码{if (FBT->left == NULL && FBT->right == NULL){int i;fprintf(fp,"%c %d:",c[index++],FBT->data);for (i = 0; i < len; i++)fprintf(fp,"%d", a[i]);fprintf(fp,"\n");}else//访问到非叶子结点时分别向左右子树递归调用,并把分支上的0、1编码保存到数组a{   //的对应元素中,向下深入一层时len值增1a[len] = 0;HuffManCoding(fp, FBT->left, len + 1);a[len] = 1;HuffManCoding(fp, FBT->right, len + 1);}}
}

节点的Huffman编码由它在Huffman树中的位置决定。从根节点到任意节点有且仅有一条路径,且路径可以唯一确定节点。因此规定从左子结点经过编码为0,从右子结点经过编码为1,路径序列作为编码。

由Huffman树和Huffman编码的性质可知,Huffman编码是一种不等长编码。在构造过程中,两个权值较小的节点生成一棵新的二叉树,根节点的权值为左右子节点的和,并不实际代表字符。也就是说,较短的编码不可能是较长编码的前缀。

Huffman树从叶子到根构造,靠近根的字符节点权值与几个靠近叶子的节点权值和相近,故而靠近根的字符节点权值较高即编码较短。

解码过程可以由字符串匹配来完成:

//Decoding
for(i = 0; code[i]; i++) {for (j = 0; j < n; j++) {t = 1;for (k = 0; coding[j][k]; k++) {if (code[i + k] != coding[j][k]) {t = 0;break;}}if (t == 1) {append(out,c[j]);i = i + k - 1;break;}}
}
printf("%s\n",out);

//Huffman.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>typedef struct
{int data;struct BTreeNode* left;struct BTreeNode* right;
}BTreeNode;#define M 32
char coding[M][M];BTreeNode* CreateHuffman(int a[], int n)
{int i, j;BTreeNode **b, *q;b = malloc(n*sizeof(BTreeNode));for (i = 0; i < n; i++)     {b[i] = malloc(sizeof(BTreeNode));b[i]->data  = a[i];b[i]->left  = NULL;b[i]->right = NULL;}for (i = 1; i < n; i++)//进行 n-1 次循环建立哈夫曼树{int k1 = -1, k2;for (j = 0; j < n; j++)        {if (b[j] != NULL && k1 == -1){k1 = j;continue;}if (b[j] != NULL){k2 = j;break;}}for (j = k2; j < n; j++)//从当前森林中求出最小权值树和次最小{if (b[j] != NULL){if (b[j]->data < b[k1]->data){k2 = k1;k1 = j;}else if (b[j]->data < b[k2]->data)k2 = j;}}q = malloc(sizeof(BTreeNode));q->data = b[k1]->data + b[k2]->data;q->left = b[k1];q->right = b[k2];b[k1] = q;b[k2] = NULL;}free(b); return q; 
}double WeightPathLength(BTreeNode* FBT, int len)//len初始为0
{if (FBT == NULL) {return 0;}else {if (FBT->left == NULL && FBT->right == NULL) {return FBT->data * len;}else {return WeightPathLength(FBT->left,len+1)+WeightPathLength(FBT->right,len+1);}}
}static int index = 0;
char *c;
void HuffManCoding(FILE *fp, BTreeNode* FBT, int len)//len初始值为0
{static int a[10];   if (FBT != NULL)    {if (FBT->left == NULL && FBT->right == NULL) {int i;fprintf(fp,"%c %d:",c[index++],FBT->data);for (i = 0; i < len; i++)fprintf(fp,"%d", a[i]);fprintf(fp,"\n");}else {  a[len] = 0;HuffManCoding(fp, FBT->left, len + 1);a[len] = 1;HuffManCoding(fp, FBT->right, len + 1);}}
}void append(char *str, char ch) {int i;for (i = 0; str[i];i++);str[i] = ch;str[i+1] = '\0';
}int main()
{int i, j, k, n, t;int* arr;char ch, in[M] = {'\0'}, code[M*M] = {'\0'}, out[M] = {'\0'};BTreeNode* fbt;FILE *fp;//Inputfreopen("test.in","r",stdin);scanf("%d", &n);arr = (int *)malloc(n * sizeof(int));c   = (char *)malloc(n * sizeof(char));arr[0] = 186;c[0] = ' ';//原谅楼主这里偷懒,空格字符的输入有点麻烦所以直接写入了for (i = 1; i < n; i++) {getchar();scanf("%c %d",&c[i],&arr[i]);}//huffman codingfbt = CreateHuffman(arr, n);fp = fopen("code.txt","w");HuffManCoding(fp, fbt, 0);fflush(fp);//Encodingfp = fopen("code.txt","r");for (i = 0; i < n; i++) {fgetc(fp);fscanf(fp,"%c %d:%s", &t, &ch, &coding[i]);}fp = fopen("src.in","r");fscanf(fp, "%s", in);for (i = 0; in[i]; i++) {for (j = 0; j < n; j++) {if (c[j] == in[i]) {strcat(code,coding[j]);}}}printf("%s\n",code);//Decodingfor(i = 0; code[i]; i++) {for (j = 0; j < n; j++) {t = 1;for (k = 0; coding[j][k]; k++) {if (code[i + k] != coding[j][k]) {t = 0;break;}}if (t == 1) {append(out,c[j]);i = i + k - 1;break;}}}printf("%s\n",out);return 0;
}

测试数据:

test.in:

27
a 4
b 13 
c 22 
d 32 
e 103 
f 21 
g 15 
h 47 
i 57 
j 1 
k 5 
l 32 
m 20 
n 57
o 63 
p 15 
q 1 
r 48 
s 51 
t 80 
u 23 
v 8 
w 18 
x 1 
y 16 
z 1

转载于:https://www.cnblogs.com/yechanglv/p/6947304.html

http://www.lbrq.cn/news/1068841.html

相关文章:

  • 响应式网站用什么软件做效果/可以免费打开网站的软件
  • 免费个人简历制作网站/关键词搜索爱站
  • 武汉百度推广seo/百度推广优化怎么做
  • 教用vs2013做网站的书/seo关键词的优化技巧
  • 网站建设包括什么科目/百度搜索引擎优化公司哪家强
  • web淘宝网站开发实例视频/百度搜索推广技巧
  • 提供微商城网站建设/百度快速收录方法
  • 做淘宝要网站/广州最新发布最新
  • 门户网站建设jz190/seo推广网址
  • 政府网站必须做等保/网站seo优化是什么意思
  • 怎样在百度上建立网站/自动交换友情链接
  • 网站建设规范/网站建设报价
  • 用dw制作做网站需要钱吗/网页代码
  • 外贸开发产品网站建设/seo宣传
  • dw网站根目录怎么做/浙江网站推广公司
  • 嵊州网站建设/重庆seo点击工具
  • 如何用网站做推广/seo推广什么意思
  • wordpress手机端图片不显示图片/北京seo如何排名
  • 广东省城乡建设厅网站/seo软文是什么
  • 怎么做付款链接网站/青岛谷歌优化
  • 做公司年报网站登录密码是什么/bt磁力天堂torrentkitty
  • 做网站为什么差价很大/百度竞价推广是什么意思
  • 东莞长安网站建设/百度pc端入口
  • 做笑话网站赚钱吗/网络营销的五个发展阶段
  • 公司电商网站开发合同范本/全球网站流量排名查询
  • 想把自己做的网站放到网上/汕头seo管理
  • 网络设备互联课设建设企业网站/企业网站的作用和意义
  • 网站添加视频代码/seo推广一年要多少钱
  • 网站备案 阿里云/网络舆情监测系统软件
  • 贵州省建设厅建筑质监站网站/如何查询域名注册人信息
  • 音视频学习笔记
  • 理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事
  • 03.一键编译安装Redis脚本
  • Supergateway教程
  • PostgreSQL面试题及详细答案120道(21-40)
  • 解锁智能油脂润滑系统:加速度与温振传感器选型协同攻略