我想出了术语“循环滚动”,希望它不会与现有术语重叠。基本上,我正在尝试设计一种算法来查找印刷文本中的循环。
一些例子从简单到复杂
这并不让我想起我所知道的任何算法。我觉得有些问题可能会存在歧义,但是找到其中一个解决方案对我来说已经足够了。效率总是受欢迎的,但不是必须的。我该怎么做?
编辑
首先,感谢所有的讨论。我从rosetta中采用了一个LZW算法,并在我的输入上运行它:
一些例子从简单到复杂
示例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
这并不让我想起我所知道的任何算法。我觉得有些问题可能会存在歧义,但是找到其中一个解决方案对我来说已经足够了。效率总是受欢迎的,但不是必须的。我该怎么做?
编辑
首先,感谢所有的讨论。我从rosetta中采用了一个LZW算法,并在我的输入上运行它:
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
压缩效果不错,但不完全符合我的要求。我需要更像是从示例中算法表示的压缩,它应该有:
- 后续序列(如果一个序列重复,中间不会有其他序列)
- 没有字典,只有循环
- 不可简化
- 具有最大序列大小(这将最小化算法表示)
- 假设嵌套循环是允许的(与我之前在评论中说的相反)
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
。 - rici