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索引数组) 谢谢,使用动态规划确实是一种很好的方法。我认为你的答案可以简化一点(见最后一个问题)。