大数据与算法系列之字符压缩编码

字符压缩编码是常常用到的编码技术,压缩的目的在于将出现频率较高的字符用短编码表示,而对于很少出现的字符用较长编码表示,从而提升字符在某些领域中的负荷,如网络传输过程中减少流量开销,常用的字符串压缩编码包括哈夫曼编码及香农-范诺编码。

哈夫曼编码

通过哈夫曼编码(Huffman Coding)方式可以对词语进行数值化,根据词语可以进行哈夫曼编码处理,以减少词语集合的表示大小,哈夫曼编码是一种无损数据压缩的权编码算法,它的思想是通过变长编码的方式对原始数据进行编码,其中的变长编码表通过权值评估的方式获得,出现权值较高的词语具有较短的编码,反之权值较低的词语具有较长的编码,使整个数据再网络中的平均传输长度变短,从而达到无损压缩数据的目的。

针对词语集合,可以通过权重的关系,将频繁出现的词语给予较短编码,词语的权重则以词频体现。

例如,对表中的数据,将词频作为权重进行哈夫曼编码

在计算哈夫曼编码之前需要建立哈夫曼树,哈夫曼树又称作最优二叉树,是一种带权路径长度最短的二叉树,带权路径长度是指所有叶节点的权重和叶节点到根节点长度的乘积,哈夫曼树编码根据权重编码后能够达到的效果的理论基础在于所有叶节点的带权路径长度相加得到的值是最小的,例如

将上图的词语按照词频的高低形成下面的词语权值关系

选择其中权值最低的两个词语组建一颗二叉树,并且将值较小的元素作为右子树,而值较大的元素作为左子树

将新组成的二叉树当做整个词语权值关系列表中的一个新词语,词语权重为两个词的权重之和,再次重复上个步骤,选取两个权值最低的组建新的二叉树

重复上面的迭代过程,直到所有的词语都成为二叉树的节点

二叉树已经成功构建,只需要将上述二叉树中所有右子树的边设定为1,所有左子树的边设定为0,即构建为一颗完整的哈夫曼树

获得每个词语的哈夫曼编码,只需要将根节点到各个词语之间的路径输出即可,获得如下表

通过上面可以得到,词频较高的词语通过哈夫曼编码之后的长度较短,而词频较低的词语讲过哈夫曼编码之后的长度较长,且每个编码都能够在哈夫曼树种寻找到对应的值,因此,是一种无损压缩

通过计算词语的哈希值和哈夫曼编码方式都可以达到词语压缩的目的,但是相对来说,哈夫曼达到的效果更好,压缩率更高,由于哈夫曼编码方式需要对词语提前进行离线计算,而计算哈希值不需要,所以在实际中会根据实际情况选择词语的哈希化或者哈夫曼编码进行词语数值化,但是计算哈希值的方式是不可逆的,不能通过词语的哈希值找到对应的原始词语,并且有一定的冲突率

香农-范诺编码

香农-范若编码(Shannon-Fan0 Coding)是通过前缀码的形式为数据进行编码处理,它将符号出现的频率或者概率由大到小进行排列,将排好的符号分为左右两组,使两组之间的频率之和或者概率之和尽可能相近,并约定左边一组标识为‘0’,右边一组标识为‘1’,再对已经分好的两组数据进行上述迭代,知道某个分组只剩下一个数据为止,它的编码构造过程也是香农-范若树的构造过程

举个栗子

根据词频,得到初始树

对词语进行分组处理,由于“12+8“与“6+5+4”较为接近,两者之差为组合最小,因此,将上面划分为两个,分别对左右添加编码“0”和“1”

第三步,由于“运动、体育”仅有两个数据,因此盒子为左右节点即可

最终得到编码

哈夫曼编码与香农-范若均属于数据压缩领域的应用,压缩的算法可以通过最终形成的编码可以看出,他们都有一个共同的特点:只有在数据的次数或者频率分布不均匀的时候,编码才能产生压缩的作用,若数据分布较为均匀,则压缩效果不明显

此外,虽然基于香农-范若编码可以使数据得到一定压缩,但是它产生的并不是最优前缀码,正是这个原因,哈夫曼编码的优势相对比较明显!

喜欢的话点个关注吧!争取每天有新文章推送哦!


猜你喜欢

转载自blog.csdn.net/qq_36421826/article/details/80564331