作为让你前进的建议。
具有足够大小的缓冲区的推测性展望,表明卓越的压缩是值得改变的。
这会改变流式传输行为(在输出发生之前需要输入更多数据),并使诸如刷新之类的操作显着复杂化。这也是压缩桩的相当大的额外负载。
在一般情况下,可以通过在可以开始新块的每个点进行分支来确保产生最佳输出,并根据需要递归两个分支,直到采用所有路线。具有嵌套行为的路径获胜。这在非平凡的输入大小上不太可能是可行的,因为何时开始新块的选择是如此开放。
简单地将其限制为最少 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.
OVERHEAD 是一个常数,用于解释切换块的成本
这很粗略,可能会得到改进,但如果没有别的,这只是分析的开始。检测代码以获取有关导致切换的原因的信息,使用它来确定更改可能有益的良好启发式方法(也许压缩比已显着下降)。
这可能导致 specChange 的构建仅在启发式认为合理时才进行。如果启发式结果是一个强有力的指标,那么您可以消除投机性质,并决定无论如何都在这一点上进行交换。