【问题标题】:How to compress a list of sorted words?如何压缩排序单词列表?
【发布时间】:2012-06-27 13:43:58
【问题描述】:

我有一个大文件,每行一个单词。整个文件已排序,我现在需要压缩它。我可以简单地使用 GZIP,结果会非常好。但是,我想知道是否可以更好地知道我们正在处理已排序的单词列表。

这是我的排序单词列表的 sn-p:

[...]
ABAISSAT
ABAISSATES
ABAISSE
ABAISSEE
ABAISSEES
ABAISSEMENT
ABAISSEMENTS
ABAISSENT
ABAISSER
ABAISSERA
ABAISSERAI
ABAISSERAIENT
ABAISSERAIS
[...]

使用前缀压缩文件会比 GZIP 产生更好的结果吗?

[...]
ABAISS AT ATES E EE EES EMENT EMENTS ENT ER ERA ERAI ERAIENT ERAIS
[...]

什么算法可以让我使用我描述的压缩类型来压缩我的单词列表?还有其他想法如何压缩数据吗?

附:我虽然关于使用 Trie 并且我实现了它。 Trie 的最终大小是内存几乎与列表本身一样大,并且加载列表的时间非常长。由于这些原因,我决定不走那条路。

【问题讨论】:

  • 您可以尝试,但通常不会比 GZIP 所能达到的效果更好,或者稍微好一点。
  • 您希望压缩文件的目的是什么?您只是想节省磁盘空间吗?您是否希望以编程方式操作压缩结构?目标是什么?
  • Bzip 和 7zip 通常比 gzip 提供更好的压缩率。
  • 目标是文件必须尽可能小,因为它最终会在移动设备上。
  • gzip/bzip 的结果是多少?这还不够小吗?如果不是,它需要小多少?另外,既然它是一个移动设备,那么运行时开销呢?我可以想象一个 稍大 的文件,它具有较少的运行时要求(或其他属性,如“单词可搜索性”)可能是有利的..这是一个基于数组的 trie(一个 not 需要完全加载)可能会“更好”,例如。

标签: algorithm compression


【解决方案1】:

您似乎在想front compression 之类的东西,其中每个条目是该条目与前一个条目共享的最左边字符数,然后是剩余的未共享字符。使用您的数据的示例:

0, ABAISSAT
8, ES
6, E
7, E
etc.

结果仍然需要 gzipping(或其他压缩)。

【讨论】:

    【解决方案2】:

    您可以创建一个函数来计算两个连续单词之间的差异,将其应用于整个列表,然后 GZIP 压缩它(另外,您需要将第一个单词保存为起点)。

    函数会是什么样子?不确定,你必须尝试一下。

    这个想法是连续单词之间的差异很小(就信息而言)。

    这与视频压缩中使用的概念想法(无论如何是其中一种技术)相同 - 连续帧将非常相似。

    【讨论】:

    • 参见stackoverflow.com/a/523785/627806,它建议将类似的算法应用于整数。显然,决定一个函数来找到两个整数之间的差异比决定两个字符串之间的差异要容易。
    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2011-05-05
    • 2012-08-26
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    相关资源
    最近更新 更多