MMYDBB 2021-09-01 07:36 采纳率: 75%
浏览 22
已结题

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

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条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 9月9日
    • 创建了问题 9月1日

    悬赏问题

    • ¥15 电视版的优酷可以设置电影连续播放吗?
    • ¥50 复现论文;matlab代码编写
    • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
    • ¥15 数字图像的降噪滤波增强
    • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
    • ¥15 MSR2680-XS路由器频繁卡顿问题
    • ¥15 VB6可以成功读取的文件,用C#读不了
    • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
    • ¥15 C++ 句柄后台鼠标拖动如何实现
    • ¥15 有人会SIRIUS 5.8.0这个软件吗