MMYDBB 2021-09-01 07:49 采纳率: 79.3%
浏览 26
已结题

为什么这个地方要将哈夫曼树的权值由大到小排列。

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;            //哈夫曼无重复前缀编码 
}
  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 1月6日
  • 已采纳回答 12月29日
  • 创建了问题 9月1日

悬赏问题

  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目