for(i=0;i<256;i++)
{ //按出现权值从大到小排序
for(j=i+1;j<256;j++){
if(header[i].count<header[j].count){
tmp=header[i];
header[i]=header[j];
header[j]=tmp;
}
}
}
for(i=0;i<256;i++) //找到第一个空的header结点
if(header[i].count==0)
break;
n=i; //因为权值已经从大到小排列并且找到了第一个空的header结点,所以这句话代表现有所有结点个数 (n)
m=2*n-1; //m代表哈夫曼树中需要的所有的结点个数
for(i=n;i<m;i++) // m=2*n-1
{
min1=999999999; //预设的最大权值,即结点出现的最大次数
for(j=0;j<i;j++)
{
if(header[j].parent!=-1)
continue; /*parent!=-1说明该结点已存在哈夫曼
树中,跳出循环重新选择新结点*/
if(min1>header[j].count) //代表不在哈夫曼树中
{
pt1=j; //j是下标
min1=header[j].count;
continue;
}
}
header[i].count=header[pt1].count;
header[pt1].parent=i;
header[i].lch=pt1;
min1=999999999;
for(j=0;j<i;j++){
if(header[j].parent!=-1)
continue;
if(min1>header[j].count)
{
pt1=j;
min1=header[j].count;
continue;
}
}
header[i].count+=header[pt1].count;
header[i].rch=pt1;
header[pt1].parent=i; //哈夫曼无重复前缀编码
}
为什么这个地方要将哈夫曼树的权值由大到小排列。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- shn_baby 2021-09-01 09:41关注
而哈夫曼树(Huffman Tree)是在叶子结点和权重确定的情况下,带权路径长度最小的二叉树,也被称为最优二叉树。
--链接转自 最全哈夫曼树哈夫曼编码讲解,兄弟你值得拥有_记录博主学到的点滴-CSDN博客 目录 1.哈夫曼树的概念 路径概念 路径长度概念 节点的带权路径长度 树的带权路径长度 2.构建哈夫曼树的步骤 3.构建哈夫曼树的完整代码 4.哈夫曼编码1.哈夫曼树的概念在正式 https://blog.csdn.net/qq_45737068/article/details/106910349
想要得到一颗哈夫曼树,就应该每次找到权值最小的两个点的权值和作为他们两个点的根节点,这样做的目的是用最大的深度乘以最小的权重。所以为了每次都取最小的两个值,就需要把数组排列一下。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥30 关于#java#的问题,请各位专家解答!
- ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
- ¥20 pcf8563时钟芯片不启振
- ¥20 pip2.40更新pip2.43时报错
- ¥15 换yum源但仍然用不了httpd
- ¥50 C# 使用DEVMOD设置打印机首选项
- ¥15 麒麟V10 arm安装gdal
- ¥20 OPENVPN连接问题
- ¥15 flask实现搜索框访问数据库
- ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备