子数组的个数

Count of subarray

问题是子数组计数的变体。给定一个数字数组,假设 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的一个子集。因此,我通过从 C2 中减去 C1 来计算它的计数,这使得 1,2 的计数为 0。类似地,2,2 的计数是 1。 我的问题是处理存在多个 parent 子集的情况。我不认为 sub-arrays 在我的结果集中出现的频率为 1。示例: 1,2,3,1,2,3,1,2,2,3

这里,1,2,3的计数是2

2,3,1 的计数是 2

现在,当我查找 2,3 的计数时,它应该是 1,因为所有更长的 parent 都涵盖了出现的次数。我该如何处理这些情况?

我认为的方法是标记 parent 的所有模式出现。在上面的例子中,标记所有出现的 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。所以,基本上,我标记了我在当前步骤中发现的所有模式出现。对于下一步,我开始从未标记的位置寻找模式,只是为了获得正确的计数。

我正在处理大数据,这似乎有点not-so-good事情要做。另外,我不确定它是否正确。任何其他方法或想法都会有很大帮助吗?

为给定数组构建 suffix array

计算给定长度的所有重复子数组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)开头的后缀,只需使用二进制搜索来获取第一个和最后一个索引(像 C++ STL 中的 std:upperboundstd:lowerbound 操作)。
对于后缀数组 中 (1,2) 的第一次和最后一次出现的相同示例索引为 0 和 1,因此计数为 last-first+1=2