【问题标题】:loop rolling algorithm循环滚动算法
【发布时间】: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


【解决方案1】:

我从一个算法开始,它给出了最大序列大小。虽然它并不总是最小化算法表示,但它可以用作近似算法。或者可以扩展到最优算法。

  1. 首先为您的文本构建Suffix array 以及LCP array
  2. 对 LCP 数组的索引数组进行排序,LCP 数组中较大元素的索引排在第一位。这会将相同长度的重复序列组合在一起,并允许以贪婪的方式处理序列,从最大序列大小开始。
  3. 提取后缀数组条目,按 LCP 值分组(分组是指具有选定 LCP 值的所有条目以及具有较大 LCP 值的所有条目),并按文本中的位置对其进行排序。
  4. 过滤掉位置差异不等于 LCP 的条目。对于剩余的条目,获取长度等于 LCP 的前缀。这给出了文本中所有可能的序列。
  5. 将按起始位置排序的序列添加到有序集合(例如二叉搜索树)。序列是按排序后的 LCP 中出现的顺序添加的,因此首先添加较长的序列。只有当它们是独立的或者其中一个完全嵌套在另一个中时,才会添加序列。相交区间被忽略。例如,在caba caba bab 序列中,abcaba 相交,因此它被忽略。但在cababa cababa babab 中,ab 的一个实例被删除,2 个实例完全在更大的序列内,2 个实例完全在它之外。
  6. 最后,这个有序集合包含生成算法表示所需的所有信息。

示例:

Text          ababcabab

Suffix array  ab abab ababcabab abcabab b bab babcabab bcabab cabab
LCP array       2    4         2       0 1   3        1      0

Sorted LCP            4 3 2 2 1 1 0 0
Positional difference 5 5 2 2 2 2 - -
Filtered LCP          - - 2 2 - - - -
Filtered prefixes   (ab ab) (ab ab)

算法草图,产生最小的算法表示。

从前面算法的前 4 个步骤开始。第五步应该修改。现在不可能忽略相交间隔,因此每个序列都添加到集合中。由于集合现在包含相交区间,因此最好将其实现为一些高级数据结构,例如,Interval tree

然后递归地确定所有序列的算法表示的长度,这些序列包含任何嵌套序列,从最小的序列开始。当评估每个序列时,计算整个文本的最佳算法表示。处理序列或整个文本的算法使用动态规划:分配一个矩阵,其列数等于文本/序列长度和行数,等于算法表示的长度;对区间树进行有序遍历,用所有序列更新这个矩阵,可能对于每个文本位置;当某个单元格可能有多个值时,要么选择其中任何一个,要么优先选择更长或更短的子序列。

【讨论】:

  • 这看起来不错,但由于输入很小,我现在最终使用了正则表达式。如果我们需要更多性能,我会尝试一下,谢谢..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多