• [无知故学习]范式HUFFMAN coding


    原文地址在这里看到的: http://blogread.cn/it/article/3051?f=wb

    传统的huffman编码采用树形结构;面临的问题就是,在encoding部分,需要扫描两次输入数据,并且建立树形结构;在decoding部分,则是需要进行树的查找操作;

    但是这个操作一则,频繁的if-else分支,会导致分支预测失误,进而影响到性能;其次,就是解码操作一般是夹杂在整个操作当中的,相应的cache line很容易被踢出来,造成cache miss;

    范式huffman: 

    encoding: 还是通过统计的出现频率,计算得出各个字符的长度数值,然后将所偶字符按照编码长度进行增序排序,现在轮到具体赋值,首先对于最长的字符进行编码,给全0,然后对于次长的,就是在之前的编码的基础上+1,同时按照长度的变化进行截断;依次操作下去知道所有字符的编码完成;当完成这个编码部分之后,当有新的字符进来需要进行编码的时候,就是一个key --> code 的映射过程,利用hash等方法是可以了;

    decoding: 由于所有的编码都是存储在一个数组当中的;所以在解码的时候就显得麻烦了些;一个直接的解法就是简单便利所有的字符编码,寻找最长的一个匹配;由于在传统的树形编码当中,解码就是沿着树枝跳转的过程,所有的编码彼此之间互不为前缀;但是在这个一维数组的,还没想到一个简单漂亮的解决方法,引用一下原文当中的描述:

      解码,比较复杂。前面已经把字符排序了,把这些字符的编码的头几位提取出来,不足的以0补充,可以发现一个特点,提取出来的数是非递增的。所以解码的时候,需要把所长度的最小的一个编码提取出来作为数组A,每提取一个BIT的时候,就跟这些编码比较一下,逐步判定。不用每个BIT都判断整个数组A,因为数组A是非递增的,而多读取一个BIT之后,值也是非递增的,所以最多把数组A遍历一遍就能找到解码方法。

  • 相关阅读:
    linux学习笔记--文件
    linux学习笔记——基础命令
    nginx实现动静分离
    keepalived+nginx高可用负载均衡环境搭建
    keepalived衡环境搭建
    redis配置文件redis.conf说明
    基于sentinel 的redis集群环境搭建
    jdk动态代理
    spring的事物实现
    Linux用户配置
  • 原文地址:https://www.cnblogs.com/superniaoren/p/3382413.html
Copyright © 2020-2023  润新知