将序列中的重复分组的算法

时间:2019-05-10 08:34:52

标签: algorithm compression

给出一个数字序列,例如:1, 2, 1, 2
是否有任何知名的算法可以检测重复并将其分组在一起,从而使所得序列的长度尽可能短?

例如,对于先前的序列,结果将为(1, 2)x2

更多示例:

Input: 1, 1, 1, 2, 1, 1, 1, 2
Output: ((1)x3, 2)x2

Input: 1, 2, 1, 2, 1, 2
Output: (1, 2)x3

Input: 1, 1, 1, 2, 1, 2
Output: (1)x2, (1, 2)x2

编辑:
结果的长度(例如(1, 2)x2)不包括有关分组和重复的任何辅助信息(即忽略(),xx之后的数字)。

例如,(1, 2)x2的长度实际上是2。 ((1)x3, 2)x2的长度仍为2,因为我们仅考虑属于原始序列的元素数(在这种情况下为1和2)。

1 个答案:

答案 0 :(得分:1)

您可以使用动态编程方法。让我们将n定义为长度输入序列,并将DP[i][j]定义为子字符串将被压缩为的最小可能长度,从索引i开始到索引j结束。然后有两种情况:

  • 一致地粘合:DP[i][j] = min(DP[i][k] + DP[k + 1][j])ki的所有j - 1

  • 重复:对于所有这样的DP[i][j] = min(DP[i][k])k都将子字符串i..j划分为相同的子字符串长度k - i + 1。我认为最小值应为k的最低值。

在两个选项中,选择最小值。字符串本身也可以还原(可以另外存储并重新计算)。从1到DP[i][i] = 1的所有i的初始数据n。答案在DP[1][n]中(如果使用1-index数组)。