【发布时间】:2012-11-01 17:34:03
【问题描述】:
我自己提出了循环滚动这个术语,希望它确实如此 不与现有术语重叠。基本上我试图想出一个 在打印文本中查找循环的算法。
从简单到复杂的一些例子
示例1
给定:
a a a a a b c d
我想说:
5x(a) b c d
或算法:
for 1 .. 5
print a
end
print b
print c
print d
示例2
给定:
a b a b a b a b c d
我想说:
4x(a b) c d
或算法:
for 1 .. 4
print a
print b
end
print c
print d
例子3
给定:
a b c d b c d b c d b c e
我想说:
a 3x(b c d) b c e
或算法:
print a
for 1 .. 3
print b
print c
print d
end
print b
print c
print d
它没有让我想起我知道的任何算法。我觉得有些 问题可能是模棱两可的,但找到一个解决方案对我来说就足够了 现在。效率总是受欢迎的,但不是强制性的。我该怎么做?
编辑
首先,感谢大家的讨论。我已经适应了 LZW 算法 来自rosetta 并在我的 输入:
abcdbcdbcdbcdef
这给了我:
a
b
c
d
8 => bc
10 => db
9 => cd
11 => bcd
e
f
我有一本字典:
a a
c c
b b
e e
d d
f f
8 bc
9 cd
10 db
11 bcd
12 dbc
13 cdb
14 bcde
15 ef
7 ab
它看起来很适合压缩,但并不是我想要的。我需要的 更像是我的示例中算法表示中的压缩 这将有:
- 后续序列(如果一个序列重复,则不会有其他序列 之间的顺序)
- 没有字典,只有循环
- 不可约
- 具有最大序列大小(这将最小化算法 代表)
- 假设允许嵌套循环(与我之前在 评论)
【问题讨论】:
-
这和Lempel–Ziv–Welch algorithm非常相似。
-
gokcehan - 是否允许嵌套循环?
-
本质上,这是关于 Kolmogorov 复杂度的压缩和边界。
-
@TedHopp:我认为有趣的案例是那些贪婪组合失败的案例,比如
a b a b a b a b c d e a b c d e,你真正想要的是3(a b) 2(a b c d e)而不是4(a b) c d e a b c d e。 -
@icepack - 另一个问题缺少当前问题的核心困难:如何识别组。 (组已在您链接到的问题中确定。)
标签: string algorithm language-agnostic compression lzw