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
想要得到一颗哈夫曼树,就应该每次找到权值最小的两个点的权值和作为他们两个点的根节点,这样做的目的是用最大的深度乘以最小的权重。所以为了每次都取最小的两个值,就需要把数组排列一下。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 运动想象脑电信号数据集.vhdr
- ¥15 三因素重复测量数据R语句编写,不存在交互作用
- ¥15 微信会员卡等级和折扣规则
- ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
- ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
- ¥15 gdf格式的脑电数据如何处理matlab
- ¥20 重新写的代码替换了之后运行hbuliderx就这样了
- ¥100 监控抖音用户作品更新可以微信公众号提醒
- ¥15 UE5 如何可以不渲染HDRIBackdrop背景
- ¥70 2048小游戏毕设项目