Compression 这个压缩算法有名字吗?

Compression 这个压缩算法有名字吗?,compression,Compression,假设你有一个四字节的整数,你想把它压缩到更少的字节。您可以对其进行压缩,因为较小的值比较大的值更有可能发生(即,值的概率随其大小而减小)。应用以下方案以生成1、2、3或4字节的结果: 注意,在下面的描述中(位基于一个,从最高有效位到最低有效位),即,第一位指最高有效位,第二位指下一个最高有效位,等等。) 如果n=128和N16384以及 N2097152和n=268435456和n表示使用较少的位来存储较常见的数据,以交换使用较多的位来存储较不常见的数据。这听起来非常类似于Dlugosz的可变长

假设你有一个四字节的整数,你想把它压缩到更少的字节。您可以对其进行压缩,因为较小的值比较大的值更有可能发生(即,值的概率随其大小而减小)。应用以下方案以生成1、2、3或4字节的结果:

注意,在下面的描述中(位基于一个,从最高有效位到最低有效位),即,第一位指最高有效位,第二位指下一个最高有效位,等等。)

  • 如果n=128和N16384以及
    N2097152和n=268435456和n表示使用较少的位来存储较常见的数据,以交换使用较多的位来存储较不常见的数据。

    这听起来非常类似于Dlugosz的可变长度整数编码。

    您的方案类似于UTF-8,这是一种用于Unicode文本数据的编码方案


    <>主要区别在于UTF-8流中的每个字节表示它是一个引线还是尾随字节,因此可以从中间开始读取一个序列。在您的方案中,如果存储了一系列这样的值,丢失的前导字节将使文件的其余部分完全无法读取。读取这样的序列必须从开头开始,而不是从任意位置开始。

    这与编码或base-128非常接近。后一个名称源于这样一个事实,即编码中的每个7位单元都可以被视为一个基数128位。

    Varint

    使用每个字节的高位表示“继续”或“停止”,其余位(序列中每个字节的7位)解释为对实际值进行编码的普通二进制:

    这听起来像中使用的“Base 128 Varint”

    压缩整数的相关方法

    总而言之:此代码表示由两部分组成的整数: 一元代码中的第一部分,表示在剩余的值中需要读取多少位;第二部分(表示的宽度,以位为单位)大致为普通二进制,对实际值进行编码

    这个特殊的代码将一元代码与二进制代码“线程化”,但其他类似的代码先打包完整的一元代码,然后打包二进制代码, 比如

    我怀疑此代码属于“启动/停止代码”系列之一 如中所述:


    史蒂文·派克——过程。2001年数据压缩会议,IEEE计算机学会出版社,2001。

    我喜欢这个!但这会破坏指针的功能。。。指针必须读取指向的值的第一位,才能知道下一个值的位置。。但这听起来确实不错,我没听说过。这个方案与UTF-8非常相似。我相信我见过一份RFC草案,它提出了这个传输任意精度整数的方案,但我的Google fu让我失望了。在任何情况下,您都无法获得专利:)啊哈:Michael Goldshteyn的算法和UTF-8之间的区别在于后者“浪费”位,以便能够高效地找到使用字符串任何给定字节的字符的开头。具体来说,第一个字节后的每个字节的格式为10xxxxxx。不,这不是哈夫曼编码。从该Wiki页面:Huffman编码使用特定方法选择每个符号的表示形式,从而产生前缀代码(有时称为“无前缀代码”,即“表示某个特定符号的位字符串决不是表示任何其他符号的位字符串的前缀”)表示最常见的源符号的字符串比用于不太常见的源符号的字符串短。@Michael Goldshteyn,您指定的值被使用的概率是其大小的倒数(越小,可能性越大)。根据您的假设,该算法是哈夫曼编码的一种形式。请注意,这是算法的一般类,而不是具体实现的名称。不,我介绍的算法属于熵编码类,但它不是基于维基百科中任何哈夫曼编码定义/实现的哈夫曼编码形式。顺便说一下,你对哈夫曼编码的定义(从答案中)适用于任何熵编码方案。这是我一直在寻找的,但它不是由德鲁戈兹发明的。larsmans在评论中发布了一个代码链接。如前所述,这不是真的。维基百科说3FFF的VLQ是
    FF7F
    。使用@Michael Goldshteyn的算法,3FFF是
    C0 3F FF
    @ikegami:重新阅读描述,你是对的:我遗漏了一些细节,包括长度是在base-1中预先加上的,而不是在整数的表示中“穿行”。尽管拉斯曼的答案与我提出的算法不同,它符合问题的精神和最接近(实际存在)的算法。因此,他得到了复选标记。