问题是子阵列计数的变体。给定一组数字,让我们说1,2,2,3,2,1,2,2,2,2
我寻找子阵列并计算每个数字的频率。我从一些K
长度子阵列开始(例如K = 3)。
子阵列1,2,2
的计数为C1:2
。
子阵列2,2,3
的计数为1
。
子阵列2,3,2
的计数为1
。
等等。
现在,我寻找长度为2的子阵列。
子阵列1,2
的计数为C2: 2
。但是(1,2)是子阵列1,2,2
的子集。因此,我通过从C1
中减去C2
来计算其计数,其中1,2
的计数为0.同样,2,2
的计数为1
。
我的问题是处理存在多个父子集的情况。我不认为我的结果集中的子数组的频率为1。示例:
1,2,3,1,2,3,1,2,2,3
此处,1,2,3
的计数为2
。
2,3,1
的计数为2
。
现在,当我查找2,3
的计数时,它应该是1,因为所有较大长度的父母已经覆盖了这些事件。我该如何处理这些案件?
我认为的方法是标记父项的所有模式出现。在上述情况下,请标记1,2,3
和2,3,1
的所有匹配项。数组看起来像这样:
1,2,3,1,2,3,1,2,2,3
X,X,X,X,X,X,X,2,2,3
其中X表示标记的位置。现在,根据未标记的位置,我们看到2,3
的频率为1。所以,基本上,我标记了我在当前步骤中找到的所有模式事件。对于下一步,我开始从未标记的位置查找模式,以获得正确的计数。
我正在处理大数据,而这似乎有点不太好。另外,我不确定它是否正确。任何其他方法或想法都会有很大帮助吗?
答案 0 :(得分:0)
为给定数组构建suffix array。
要计算给定lengt的所有重复子阵列 h - 遍历此后缀数组,比较邻居后缀所需的前缀长度。
第一个例子
source array
1,2,2,3,2,1,2,2,2,2
suffix array is
5,0,9,4,8,7,6,1,2,3:
1,2,2,2,2 (5)
1,2,2,3,2,1,2,2,2,2 (0)
2 (9)
2,1,2,2,2,2 (4)
2,2 (8)
2,2,2 (7)
2,2,2,2 (6)
2,2,3,2,1,2,2,2,2 (1)
2,3,2,1,2,2,2,2 (2)
3,2,1,2,2,2,2 (3)
长度为2时,我们可以计算两个子阵列1,2
和四个子阵列2,2
如果你想计算任何给定的子数组 - 例如,以(1,2)
开头的所有后缀,只需使用二进制搜索来获取第一个和最后一个索引(如{{1}和C ++ STL中的std:upperbound
操作
对于相同示例,后缀数组中第一次和最后一次出现std:lowerbound
的索引为0和1,因此计数为(1,2)