【发布时间】:2010-10-25 02:59:20
【问题描述】:
我敢打赌以前有人解决过这个问题,但我的搜索结果是空的。
我想将单词列表打包到缓冲区中,跟踪每个单词的起始位置和长度。诀窍是我想通过消除冗余来有效地打包缓冲区。
示例:娃娃屋
这些可以像dollhouse一样打包到缓冲区中,记住doll是从位置0开始的四个字母,dollhouse是从位置0开始的九个字母,house是从位置3开始的五个字母。
到目前为止,我想出的是:
- 将单词从最长到最短排序:(娃娃屋、房子、娃娃)
- 扫描缓冲区以查看字符串是否已作为子字符串存在,如果存在,请记下位置。
- 如果不存在,请将其添加到缓冲区的末尾。
由于长词通常包含较短的词,因此效果很好,但应该可以做得更好。例如,如果我将单词列表扩展为包含 ragdoll,那么我的算法会得出dollhouseragdoll,它的效率低于ragdollhouse。
这是一个预处理步骤,所以我并不十分担心速度。 O(n^2) 很好。另一方面,我的实际列表有数万个单词,所以 O(n!) 可能是不可能的。
附带说明,此存储方案用于 TrueType 字体的“名称”表中的数据,参见。 http://www.microsoft.com/typography/otspec/name.htm
【问题讨论】:
-
你不能只使用 gzip 之类的东西吗?
-
您所描述的是所有压缩算法所做的,除了您添加了将纯文本单词视为被压缩的元素而不是位的约束。
-
它与压缩算法不太一样,因为每个单词都必须保持其“冗长”。就像我在另一条评论中所说的那样,您不能将“lawman”和“woman”组合在一起,但在压缩中,将“man”压缩在一起就可以了,因为您不需要保持一个一致的缓冲区。
-
另外,FWIW,该解决方案应该能够利用多个后缀和前缀匹配。所以如果我的词表有“lawman”、“woman”、“manage”和“mangle”,它应该能够形成“lawmanage”和“womangle”。
-
@Adrian:这是错误的区分。是的,您可以通过访问索引来就地解压缩索引打包数据,我同意这个方案特别适合这种用途,但它仍然是压缩;有一个处理步骤来访问原始数据。其他压缩也可以就地完成。