Language agnostic 为什么LZ77实现不同?

Language agnostic 为什么LZ77实现不同?,language-agnostic,compression,lz77,Language Agnostic,Compression,Lz77,我试图找到LZ77的正确实现,LZ77是中国最早的著名算法。我发现有许多不同的实现可以产生不同的输出,但仍然标记为LZ77。有些人使用哈希表,例如,在LZRW或LZJB等更“官方”的算法中使用的哈希表。所以我很困惑 我测试过的一些实现: (C,742>538字节,哈希表?混乱输出) (C++,742>508字节,哈希表?混乱输出) (C,742>642字节——输出中包含可读的ASCII) (JS,742>863字节!!--输出中包含可读的ASCII) (JS,742>658字节——输出中包含可读

我试图找到LZ77的正确实现,LZ77是中国最早的著名算法。我发现有许多不同的实现可以产生不同的输出,但仍然标记为LZ77。有些人使用哈希表,例如,在LZRW或LZJB等更“官方”的算法中使用的哈希表。所以我很困惑

我测试过的一些实现:

  • (C,742>538字节,哈希表?混乱输出)
  • (C++,742>508字节,哈希表?混乱输出)
  • (C,742>642字节——输出中包含可读的ASCII)
  • (JS,742>863字节!!--输出中包含可读的ASCII)
  • (JS,742>658字节——输出中包含可读的ASCII)
  • (JS,742>639字节——输出中包含可读的ASCII)
  • (C,742>755字节!!)
  • 据我所知,没有人使用任何后处理编码,如哈夫曼等

    我用来压缩的文本:

    Oho! Oho! Rise up, O Teti!
    Take your head, collect your bones,
    Gather your limbs, shake the earth from your flesh!
    Take your bread that rots not, your beer that sours not,
    Stand at the gates that bar the common people!
    The gatekeeper comes out to you, he grasps your hand,
    Takes you into heaven, to your father Geb.
    He rejoices at your coming, gives you his hands,
    Kisses you, caresses you,
    Sets you before the spirits, the imperishable stars...
    The hidden ones worship you,
    The great ones surround you,
    The watchers wait on you,
    Barley is threshed for you,
    Emmer is reaped for you,
    Your monthly feasts are made with it,
    Your half-month feasts are made with it,
    As ordered done for you by Geb, your father,
    Rise up, O Teti, you shall not die!
    
    它们都有不同的输出流。是否没有LZ77的纯参考实施或标准可供检查

    为什么所有的“LZ77”压缩器不能提供相同的压缩比、相同的输出比特流?

    没有一种特定的方法来实现LZ77 LZ77仅提供算法本身的一般数学概念。它是灵活的,因为它的参数可以改变,从而对编码器和解码器产生不同的要求,并且可以极大地影响产生的数据流。由实现来决定这些细节,例如缓冲区的大小以及如何构造码字。这些参数的敏感性就是为什么相互竞争的实现可能称自己为LZ77,但却不兼容

    例如,指定32768窗口大小,并将位置和长度存储为15+8位码字。更简单但效率较低的实现可能选择12位距离和4位长度,给出4096字节的窗口大小。另一个可能会选择8192字节的窗口大小,使用13位来表示距离,如果每个令牌使用16位,则长度只剩下3位

    这种自由带来了其他方面的创新,比如LZS引入文字标志,或者LZRW使用哈希表。另一个流行的创新是后续基于LZ的压缩(如在DEFLATE中)或另一个熵编码器,以提高压缩比