子阵数

时间:2017-09-11 18:15:57

标签: arrays algorithm count subset sub-array

问题是子阵列计数的变体。给定一组数字,让我们说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,32,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。所以,基本上,我标记了我在当前步骤中找到的所有模式事件。对于下一步,我开始从未标记的位置查找模式,以获得正确的计数。

我正在处理大数据,而这似乎有点不太好。另外,我不确定它是否正确。任何其他方法或想法都会有很大帮助吗?

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)