我正在写一个压缩库作为一个副作用小的项目,我还远远不够沿(我的图书馆可以提取任何标准的gzip文件,以及符合要求的(但肯定没有达到最佳效果)的gzip输出),它是时间找出有意义的块终端策略。目前,我只是削减输入的每32K(LZ77窗口大小),因为它是conveinent和快速实施后关闭块 - 现在我要回,并试图实际提高压缩效率

减缩规格只这样说的:”压缩机终止时,它判断为开始用新鲜的树木的新块将是有用的,或当块大小填满了压缩机的块缓冲”,这是不是所有的有用的块。

我通过SharpZipLib代码排序(我想这将是mosteasily可读开源实现),并且发现它终止的块输出的每一16K文字,忽略输入。这是很容易实现,但似乎必须有一些针对性的办法,尤其是考虑到规范的语言“确定开始用新鲜的树一个新的模块将是有益的。”

因此,没有人有现有的新策略的任何想法,或例子?

提前感谢!

有帮助吗?

解决方案

作为一个建议,让你去。

具有足够大小的优越的压缩的指示的缓冲器提前投机的外表是值得的变化。

此改变了流动动作(发生输出之前更多的数据需要为输入),并且显著等冲洗复杂操作。它也是在压缩赌注相当额外的负载。

在一般情况下这将是可能的,以确保该所产生的最优输出简单地通过在其中可以启动一个新的块中的每个点分支,取两个分支递归必要直到采取的所有路由。这有巢行为的路径获胜。这是不太可能是对非平凡输入尺寸可行的,因为当启动一个新的块的选择是这样打开的。

简单地将其限制到最小的8K输出文字,但防止在块大于32K文字将导致对于试图推测算法相对易于处理的基础。调用8K的子块。

在其最简单的将是(伪代码):

create empty sub block called definite
create empty sub block called specChange
create empty sub block called specKeep
target = definite
While (incomingData)
{
  compress data into target(s)    
  if (definite.length % SUB_BLOCK_SIZ) == 0)
  {
    if (targets is definite)
    {
      targets becomes 
        specChange assuming new block 
        specKeep assuming same block as definite
    }        
    else
    {
      if (compression specChange - OVERHEAD better than specKeep)
      {
        flush definite as a block.
        definite = specChange
        specKeep,specChange = empty
        // target remains specKeep,specChange as before 
        but update the meta data associated with specChange to be fresh
      }
      else 
      {
        definite += specKeep
        specKeep,specChange = empty
        // again update the block meta data
        if (definite is MAX_BLOCK_SIZE)
        {
          flush definite
          target becomes definite 
        }
      }
    }
  }
}
take best of specChange/specKeep if non empty and append to definite
flush definite.

开销是一些恒定占超过块切换的成本

这是粗糙的,并且有可能成为改善,但对分析,如果没有别的开始。仪器是什么原因导致一个开关,用它来确定良好的启发,一个变化可能是有益的(也许是压缩比已经下降显著)信息的代码。

这可能会导致specChange建设正在做,只有当启发式认为这是合理的。如果启发式原来是是一个重要指标,那么你可以与投机性质做掉,只是决定在该点交换不管是什么。

其他提示

嗯,我喜欢一些启发式分析的主意,试图想出一些“规则”结束块时可能是有益的。我会考虑你今晚建议的方法,看看有什么我可以用它做什么。

在此期间,它发生,我认为,为了使在这个问题上充分知情选择,我需要的块大小决定的利弊的更好的心理画面。真的很快,我得到的是更小的块让你有一个潜在的更有针对性的符号字母 - 在增加开销的更频繁地定义树的成本。较大的块计数器它们更一般的符号字母表带刻度的efficiences(只有一个树来存储和解码,以便大量的编码数据的)。

关我的头的顶部,这不是显而易见的是否码litteral与长度的相对分布,距离码会对最佳块大小的特定的影响。良好的精神食粮,但。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top