Algorithm 在序列中对重复进行分组的算法

Algorithm 在序列中对重复进行分组的算法,algorithm,compression,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)不

给定一系列数字,例如:
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
)不包括关于分组和重复的任何边信息(即忽略
()、x
x
之后的数字)

例如,
(1,2)x2
的长度实际上是2。
<代码>((1)x3,2)x2</代码>的长度仍然是2,因为我们只考虑属于原始序列的元素的数量(在这种情况下是1和2)。让我们将
n
定义为长度输入序列,
DP[i][j]
定义为子字符串压缩到的最小可能长度,从索引
i
开始,到索引
j
结束。然后有两种情况:

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

  • 重复:
    DP[i][j]=min(DP[i][k])
    对于将子串
    i..j
    划分为长度相同的子串
    k-i+1
    。我认为最小值应该是
    k
    的最小值


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

谢谢,使用动态规划确实是一种很好的方法。我认为你的答案可以简化一点(见最后一个问题)。