精华内容
下载资源
问答
  • 2021-05-18 13:04:16

    《C语言哈夫曼编码代码》由会员分享,可在线阅读,更多相关《C语言哈夫曼编码代码(3页珍藏版)》请在人人文库网上搜索。

    1、可编辑#include#include#includeintm,s1,s2;typedefstructunsignedintweight;unsignedintparent,lchild,rchild;HTNode,*HuffmanTree;/动态分配数组存储哈夫曼树typedefchar*HuffmanCode;/动态分配数组存储哈夫曼编码表voidSelect(HuffmanTreeHT,intn)inti,j;for(i=1;iHTi.weight)&(!HTi.parent)&(s2!=i)s1=i;for(j=1;jHTj.weight)&(!HTj.parent)&(s1!=j)s。

    2、2=j;voidHuffmanCoding(HuffmanTree&HT,HuffmanCodeHC,int*w,intn)/算法6.13/w存放n个字符的权值(均0),构造哈夫曼树HT,/并求出n个字符的哈夫曼编码HCinti,j;char*cd;intp;intcdlen;if(n=1)return;m=2*n-1;HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode);/0号单元未用for(i=1;i=n;i+)/初始化HTi.weight=wi-1;HTi.parent=0;HTi.lchild=0;HTi.rchild=0;for(i=n+1;i=m;i。

    3、+)/初始化HTi.weight=0;HTi.parent=0;HTi.lchild=0;HTi.rchild=0;puts(n哈夫曼树的构造过程如下所示:);printf(HT初态:n结点weightparentlchildrchild);for(i=1;i=m;i+)printf(n%4d%8d%8d%8d%8d,i,HTi.weight,HTi.parent,HTi.lchild,HTi.rchild);printf(按任意键,继续.);getchar();for(i=n+1;i=m;i+)/建哈夫曼树/在HT1.i-1中选择parent为0且weight最小的两个结点,/其序号分别为s。

    4、1和s2。Select(HT,i-1);HTs1.parent=i;HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;printf(nselect:s1=%ds2=%dn,s1,s2);printf(结点weightparentlchildrchild);for(j=1;j=i;j+)printf(n%4d%8d%8d%8d%8d,j,HTj.weight,HTj.parent,HTj.lchild,HTj.rchild);printf(按任意键,继续.);getchar();/-无栈非递归。

    5、遍历哈夫曼树,求哈夫曼编码cd=(char*)malloc(n*sizeof(char);/分配求编码的工作空间p=m;cdlen=0;for(i=1;i=m;+i)/遍历哈夫曼树时用作结点状态标志HTi.weight=0;while(p)if(HTp.weight=0)/向左HTp.weight=1;if(HTp.lchild!=0)p=HTp.lchild;cdcdlen+=0;elseif(HTp.rchild=0)/登记叶子结点的字符的编码HCp=(char*)malloc(cdlen+1)*sizeof(char);cdcdlen=0;strcpy(HCp,cd);/复制编码(串)e。

    6、lseif(HTp.weight=1)/向右HTp.weight=2;if(HTp.rchild!=0)p=HTp.rchild;cdcdlen+=1;else/HTp.weight=2,退回退到父结点,编码长度减1HTp.weight=0;p=HTp.parent;-cdlen;/HuffmanCodingintmain()HuffmanTreeHT;HuffmanCode*HC;int*w,n,i;puts(输入结点数:);scanf(%d,&n);getchar();HC=(HuffmanCode*)malloc(n*sizeof(HuffmanCode);w=(int*)malloc(n*sizeof(int);printf(输入%d个结点的权值n,n);for(i=0;in;i+)scanf(%d,&wi);getchar();HuffmanCoding(HT,HC,w,n);puts(n各结点的哈夫曼编码:);for(i=1;i=n;i+)printf(%2d(%4d):%sn,i,wi-1,HCi);getchar();精品文档。

    更多相关内容
  • 哈夫曼编码

    2020-05-14 22:56:01
    问题 代码(码字):Q{001,00,010,01}表示字符a,b,c,d 同一序列:0100001 产生两种译码(产生歧义...二元前缀编码存储:二叉树结构,每个字符作为树叶,对应这个字符的前缀码看作根到这片树叶的一条路径,每个节

    问题

    代码(码字):Q{001,00,010,01}表示字符a,b,c,d
    同一序列:0100001
    产生两种译码(产生歧义):01 00 001;010 00 01
    二元前缀码:任何字符的代码不能作为其他字符代码的前缀
    利用二元前缀码译码:从第一个字符开始一次读入每个字符(0或1),如果发现独到的字串与某个码字相等,就将这个子串译作相应的码字:然后从下一个字符开始继续这个过程,直到读完输入的字符串为止。
    二元前缀编码存储:二叉树结构,每个字符作为树叶,对应这个字符的前缀码看作根到这片树叶的一条路径,每个节点通向做儿子的边记作0,通向右儿子的边记作1。
    问题:给定字符集C={x1,x2,…,xn}和每个字符的频率f(xi),求关于C的一个最优前缀码。

    解析

    构造最优前缀码的贪心算法为哈夫曼算法。
    在这里插入图片描述

    设计

    1、数组haftree初始化,所有数组元素的双亲、左右孩子都置为-12、数组haftree的前n个元素的权值置给定权值; 
    3、进行n-1次合并 3.1 在二叉树集合中选取两个权值最小的根节点,其下标分别为i1,i2; 3.2 将二叉树i1、i2合并为一棵新的二叉树k。

    分析

    时间复杂度:O(nlogn)。

    源码

    #include<bits/stdc++.h> 
    using namespace std;
    typedef long long ll;
    const int maxn=1e4;
    const int inf=0x3f3f3f3f;
    
    int main() {
        int n;
        while(~scanf("%d", &n)) {
            priority_queue<ll, vector<ll>, greater<ll> >q;
            ll res = 0;
            for (int i = 1; i <= n; ++i) {
                ll x;
                scanf("%lld", &x);
                q.push(x);
            }
            while (1) {
                ll a = q.top();
                q.pop();
                if (q.empty())break;
                ll b = q.top();
                q.pop();
                res += a + b;
                q.push(a + b);
            }
            printf("%lld\n", res);
        }
    }

    Github:

    https://github.com/Geedhayb/Geed/blob/master/Huffman.cpp

    展开全文
  • 哈夫曼编码的matlab代码 Huffman_Coding Matlab代码实现哈夫曼编码 博客: 请依据哈夫曼编码的方法对如下的字符进行编码,并计算产生的码流的编码压缩效率: 练习一:...
  • 哈夫曼树-哈夫曼编码

    2019-06-19 15:03:28
    哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为...

    哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

    如果需要传输一段文字“BADCADFEED”,可以用二进制编码表示。

    这个时候数据编码后是“001000011010000011101100100011”,对方接受后每三位一分进行译码。但是在一段文章中,字母的出现频率肯定有高有低,出现频率高的元素的二进制越短,传输的时候的数据也会越短。如果把上面表格中多余的前导0去掉,例如:B:1,D:11,那么编码之后的二进制的确变短了,但是译码的时候无法知道接受的数据中的11代表两个B还是一个D。

        通过哈夫曼编码可以构造出最优的二叉树-哈夫曼树来确定如何编码。假设

    字母

    A

    B

    C

    D

    E

    F

    频率(%)

    27

    8

    15

    15

    30

    5

    哈夫曼编码的规则就是:

    1、先找出权值(频率){30,27,15,15,8,5}最小的两个作为左右子树构造一棵新树。即取5,8构成新树,其结点为5+8=13,如图:

    2、再把新生成的权值为13的结点放到剩下的集合中,所以集合变成{30,27,15,15,13},再根据1,取最小的两个权值构成新树,如图:

    3、再依次建立哈夫曼树,如下图:

    4、带入对应的字符,左分支为0,右分支为1。

    对字母用其从树根到所在叶子所经过路径的0或1来编码,可以得到下表:

    字母

    A

    B

    C

    D

    E

    F

    二进制字符

    01

    1001

    101

    00

    11

    1000

    对比一下两种编码方式:大于节约17%的存储或传输成本。

    编码中非0即1,长短不等的话其实很容易混淆的,所以若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称作无前缀编码。

    哈夫曼编码是一种无前缀编码。解码时不会混淆。其主要应用在数据压缩,加密解密等场合。如果考虑到进一步节省存储空间,就应该将出现概率大(占比多)的字符用尽量少的0-1进行编码,也就是更靠近根(节点少),这也就是最优二叉树-哈夫曼树。

    展开全文
  • 哈夫曼编码详解——图解真能看了秒懂

    万次阅读 多人点赞 2020-06-13 12:51:05
    已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能是:(2分) A. 00, 1011, 01, 1010, 11, 100 B. 00, 100, 110, 000, 0010, 01 C. 10, 1011, ...

    因为初学哈夫曼编码时间有些长了,难免会忘记,后上网查了下很多不能让我一下子回忆起这个编码具体实现步骤。现在懂了之后来总结一下,让跟我一样的人能快速回忆。


    直接上题目:

    已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能是:(2分)

    A. 00, 1011, 01, 1010, 11, 100

    B. 00, 100, 110, 000, 0010, 01

    C. 10, 1011, 11, 0011, 00, 010

    D. 0011, 10, 11, 0010, 01, 000

    步骤一:

    1.找最小两个次数(这里是2和3)

    2.把他们放进树中(小左大右

    3.每次组合都多一个父节点(即2+3=5)

    步骤二:

    1.再选出2个最小的数(排除上面已经选了的)——选出了4和6

    2.因为4<5 , 6>5(5为步骤一中组合后的父节点)

    3.单独拿4来跟5组合(小左大右)        【如果拿出的2个数都比5小,则这2个数自己组合后跟5组合,下面提到】

    步骤三:

    1.因为步骤二用掉了4,还没用6。现在取最小2个数

    2.因为6 < 9 , 8< 9 所以6和8自己组合(小左大右) (组合后先放一边)

    步骤四:

    1.取出最后10

    2.10要和这两个子树根节点最小的组合(9<14,所以和9组合)(小左大右) 

    3.然后把14的子树组合上去(小左大右)  所以放左边

    步骤五:

    组合完哈夫曼树后,将对应的字符填上去

    步骤六:

    从根节点开始向下走往左为0,往右1。走到对应的字符的路径就是该字符的哈夫曼编码(左0右1

    最后结果:

    字符哈夫曼编码
    a00
    b1011
    c01
    d1010
    e11
    f100

    所以最后答案 A

    已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能是:(2分)

    A. 00, 1011, 01, 1010, 11, 100

    B. 00, 100, 110, 000, 0010, 01

    C. 10, 1011, 11, 0011, 00, 010

    D. 0011, 10, 11, 0010, 01, 000


    我觉得我讲明白了。

    不知道你们有没有秒懂!哈哈哈。

    如果我有哪里出错,或是不懂的地方     欢迎评论留言

    帅哥美女总会随手点赞👍👍👍
    帅哥美女总会随手点赞👍👍👍
    帅哥美女总会随手点赞👍👍👍

    展开全文
  • (2)将彩色图像的像素 R、G、B 值作为独立符号,进行哈夫曼编码和解码,计算熵和码字平均码长。 (3)将彩色图像的像素 R、G、B 值作为联合符号,进行哈夫曼编码和解码,计算熵和码字的平均码长。
  • PAGE / NUMPAGES 哈夫曼编码及Matlab实现 哈夫曼编码是一种所得码字是异前置的变长码,其平均码长最短,被称为最佳变长码,也称为哈夫曼编码 其具体编码方法如下 1将信源信息符号按概率大小排队 2从最小概率的两个消息...
  • 这个代码是用C/C++实现哈夫曼编码并将编码输出。 文本为操作者输入,,对各字符进行频率统计,然后进行哈夫曼编码,并将编码结果输出,同时可求得平均码长。
  • 2018.2.14 Java中的哈夫曼编码

    千次阅读 2021-03-15 02:54:44
    ###概念哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,...
  • 哈夫曼编码(理解)

    千次阅读 2021-08-18 19:55:50
    在数据结构理论中,哈夫曼树又称为最优树,相关的知识点还有哈弗曼编码等。在正式介绍哈夫曼树之前,需要知道下面的知识点: (1)节点路径 按照规定,将树中一个节点到另一个节点所经历的分支,称为节点路径,...
  • 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为...
  • 哈夫曼树、哈夫曼编码详解

    千次阅读 多人点赞 2021-06-17 09:33:06
    哈夫曼树、哈夫曼编码,也就这么一回事,一文搞懂!
  • 哈夫曼编码huffman.c

    2019-11-19 16:40:39
    二进制哈夫曼编码,输入码字个数以及各码字概率,输出哈夫曼编码表,可检查无效输入。(这里码字概率和需为1,不过注释里可以修改这个限制)
  • 哈夫曼树/哈夫曼编码

    2021-04-18 14:02:49
    哈夫曼树(大话数据结构6.12对哈夫曼树及哈夫曼编码讲的不错): 相关概念: 1.路径长度:树中两个节点间的分支数目称为路径长度。 2.树的路径长度是根节点到其他所有节点的路径长度之和。 3.节点的带权路径长度:...
  • 用C++进行哈夫曼编码计算信源熵及编码效率 统计各种概率
  • - 欢迎下载 哈夫曼编码及Matlab实现 哈夫曼编码是一种所得码字是异前置的变长码其平均码长最短被称为最佳变长码也称为哈夫曼编码 其具体编码方法如下 1将信源信息符号按概率大小排队 2从最小概率的两个消息开始编码...
  • 哈夫曼编码及译码.cpp

    2020-05-21 16:35:37
    它对需要编码的数据进行两遍扫描:第一遍统计原数据中各字符出现的频率,利用得到的频率值创建哈夫曼树,并必须把树的信息保存起来,...第二遍则根据第一遍扫描得到哈夫曼树进行编码,并把编码得到码字存储起来。
  • 哈夫曼编码(Huffman Coding)

    千次阅读 2021-01-05 10:53:34
    霍夫曼编码、哈夫曼编码、编码压缩、不等长编码、等长编码
  • 文章目录哈夫曼树和哈夫曼编码关于编码哈夫曼树哈夫曼编码构造哈夫曼树 哈夫曼树和哈夫曼编码 关于编码 常用编码方式 等长码:每个字符对应码字的码长都一样,例如ASCII码表中的128个字符可以用7位码长的01位串...
  • 让我们进行哈夫曼编码。 搭建哈夫曼树时,我们先找到最小的两个频率 a : 3,b : 22(ef : 22) 这两个相加之后为 25,此时频率为:{25,c : 44,ef : 22,sp : 44} 我们再找最小的两个频率 25,ef : 22 这两个...
  • 哈夫曼编码译码

    千次阅读 多人点赞 2021-12-31 19:36:16
    编写一个哈夫曼编码译码程序。 按词频从小到大的顺序给出各个字符(不超过30个)的词频,根据词频构造哈夫曼树,给出每个字符的哈夫曼编码,并对给出的语句进行译码。 为确保构建的哈夫曼树唯一,本题做如下限定: ...
  • 哈夫曼编码 本来是想着慢慢找时间按顺序补上这些数据结构的内容,但前几天有朋友找我写一个计算出哈夫曼编码的程序(课程作业吧,好像~哈哈哈),所以就先把哈夫曼树的东西写下来。 先来介绍一下哈夫曼编码吧 哈夫曼树...
  • 哈夫曼编码原理了解一下

    万次阅读 2018-06-14 21:27:16
    什么是哈夫曼编码呢?这种编码方法在1952年由美国计算机科学家戴维·哈夫曼先生提出,它是一种数据压缩技术。这是一种很著名的编码方法哦,我们来了解一下吧。为啥说它是一种数据压缩技术呢,这完全因为它的编码思想...
  • 哈夫曼编码的详细讲解(基于java): 本文参考: link. 什么是霍夫曼编码 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。该方法完全依据字符出现概率来构造异...
  • 哈工大数据结构实验二——哈夫曼编码与译码方法

    千次阅读 多人点赞 2020-10-22 22:00:03
    哈夫曼树:
  • 哈夫曼树和哈夫曼编码

    千次阅读 2021-11-23 19:18:21
    哈夫曼树,又称最优二叉树,是带权路径长度最短的数,可用来构造最优编码,用于信息传输,数据压缩等方面,是一种应用广泛的二叉树。 首先介绍一些与哈夫曼树相关的基本概念: 路径:书中一个节点到另一个节点之间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,367
精华内容 546
关键字:

哈夫曼编码怎么得到码字

友情链接: bunnui.zip