找到提供最佳压缩的前缀substring

时间:2008-09-29 21:10:30

标签: algorithm compression puzzle

问题:

给定一个字符串列表,找到子字符串,如果从匹配的所有字符串的开头减去并用转义字节替换,则给出最短的总长度。

示例:

"foo""fool""bar"

结果是:“foo”作为基本字符串,包含字符串"\0""\0l""bar",总长度为9个字节。 "\0"是转义字节。原始字符串长度的总和是10,所以在这种情况下我们只保存了一个字节。

天真的算法如下:

for string in list
  for i = 1, i < length of string
      calculate total length based on prefix of string[0..i]
      if better than last best, save it
return the best prefix

这会给我们答案,但它就像O((n * m)^ 2),这太贵了。

3 个答案:

答案 0 :(得分:7)

使用前缀树林(trie)......

  f_2    b_1
 /       |
 o_2     a_1
 |       |
 o_2     r_1
 |
 l_1

然后,我们可以通过最大化(depth * frequency)找到最佳结果并保证它,它将被您的转义字符替换。您可以通过执行分支和边界深度优先搜索来优化搜索。

关于复杂性:O(C),如评论中所提到的,用于构建它,并且为了找到最优,它取决于。如果您订购第一个元素频率(O(A) - 其中A是语言字母表的大小),那么您将能够删除更多分支,并且很有可能获得亚线性时间。 / p>

我认为这很清楚,我不会写出来 - 这是一项家庭作业? ;)

答案 1 :(得分:1)

我会先尝试排序列表。然后你只需从字符串到字符串,将第一个字符与下一个字符串的第一个字符进行比较。一旦你有匹配,你会看到下一个字符。到目前为止,您需要设计一种方法来跟踪最佳结果。

答案 2 :(得分:1)

好吧,第一步是对列表进行排序。然后一个通过列表,将每个元素与前一个元素进行比较,跟踪最长的2个字符,3个字符,4个字符等运行。那么数字是20个3个字符的前缀,比15个4个字符的前缀好。