MMYDBB 2021-09-01 07:49 采纳率: 75%
浏览 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日

悬赏问题

  • ¥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后投屏调试只能显示一个设备