鱼C论坛

 找回密码
 立即注册
查看: 2669|回复: 6

哈夫曼编码问题

[复制链接]
发表于 2021-12-17 14:10:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 看清之后才看轻 于 2021-12-17 15:28 编辑
#include <stdio.h>
#include <stdlib.h>

#define n 7
#define m 2 * n - 1
#define maxval 100.0 //令maxval为最大值
typedef struct
{
    float weight;
    int parent, lchild, rchild;
} hufmtree;
typedef struct
{
    char bits[n];
    int start;
    char ch;
} Codetype;
Codetype code[n];
hufmtree tree[2 * n - 1];
void Huffman(hufmtree tree[])
{
    int i, j, p1, p2;
    float small1, small2, f;
    for (i = 0; i < m; i++)
    {
        tree[i].parent = 0; //初始化数组
        tree[i].lchild = 0;
        tree[i].rchild = 0;
        tree[i].weight = 0.0;
    }
    printf("Input every character's weight!\n");
    for (i = 0; i < n; i++)
    {
        scanf("%f", &f);
        tree[i].weight = f;
    }
    for (i = n; i < m; i++)
    {
        p1 = p2 = 0;
        small1 = small2 = maxval;
        for (j = 0; j <= i - 1; j++)
        {
            if (tree[j].parent == 0)
                if (tree[j].weight < small1)
                {
                    small2 = small1;
                    small1 = tree[j].weight;
                    p2 = p1;
                    p1 = j;
                    // printf("%d#",p1);
                }
                else if (tree[j].weight < small2)
                { //查找次小权,并用p2记录下标
                    small2 = tree[j].weight;
                    p2 = j;
                    // printf("%d#",p2);
                }
            tree[p1].parent = tree[p2].parent = i;
            tree[i].weight = tree[p1].weight + tree[p2].weight;
            tree[i].lchild = p1;
            tree[i].rchild = p2;
        }
    }
}
void HuffmanCode(hufmtree tree[])
{
    int i, j, p;
    for (i = 0; i < n; i++)
    {
        code[i].start = n - 1;
        j = i;
        p = tree[i].parent;
        while (p != 0)
        {
            // printf("%d %d#\n",i,j);
            if (tree[p].lchild == j)
                code[i].bits[code[i].start] = '0';
            else
                code[i].bits[code[i].start] = '1';
            code[i].start--;
            j = p;
            p = tree[p].parent;
        }
    }
}
void print_prefix_code(Codetype code[])
{
    for (int i = 0; i < n ; i++)
    {
        printf("%c's prefix code is ", code[i].ch);
        for (int j = 0; j < n; j++)
        {
            printf("%c", code[i].bits[j]);
        }
        printf("\n");
    }
}
int main()
{
    printf("Input code character!Maxsize is 7.\n");
    for (int i = 0; i < n; i++)
    {
        scanf("%c", &code[i].ch);
    }
    Huffman(tree);
    HuffmanCode(tree);
    // for (int i = 0; i < n; i++)
    // {
    //     printf("%f ",tree[i].weight);
    // }
    print_prefix_code(code);

    return 0;
}
请问这个代码为什么输入ABCDEFG和0.40 0.30 0.15 0.05 0.04 0.03 0.03输出的编码不是唯一的?
QQ图片20211217141018.png
QQ图片20211217141719.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-17 15:36:25 | 显示全部楼层
数据结构 上学期的 学得人麻了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-17 16:16:56 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-17 17:21:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-18 08:04:30 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-18 12:12:40 | 显示全部楼层

回帖奖励 +10 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-21 14:06:52 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 21:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表