子数组的个数
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,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。所以,基本上,我标记了我在当前步骤中发现的所有模式出现。对于下一步,我开始从未标记的位置寻找模式,只是为了获得正确的计数。
我正在处理大数据,这似乎有点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:upperbound
和 std:lowerbound
操作)。
对于后缀数组 中 (1,2)
的第一次和最后一次出现的相同示例索引为 0 和 1,因此计数为 last-first+1=2
问题是子数组计数的变体。给定一个数字数组,假设 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,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。所以,基本上,我标记了我在当前步骤中发现的所有模式出现。对于下一步,我开始从未标记的位置寻找模式,只是为了获得正确的计数。
我正在处理大数据,这似乎有点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:upperbound
和 std:lowerbound
操作)。
对于后缀数组 中 (1,2)
的第一次和最后一次出现的相同示例索引为 0 和 1,因此计数为 last-first+1=2