Arrays 子阵计数
问题是子阵列计数的一种变体。给定一个数字数组,比如说,Arrays 子阵计数,arrays,algorithm,count,subset,sub-array,Arrays,Algorithm,Count,Subset,Sub Array,问题是子阵列计数的一种变体。给定一个数字数组,比如说,1,2,2,3,2,1,2,2,2我查找子数组并计算每个子数组的频率。我首先从一些Klength子数组(例如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。 我的问题是处理存在多个父子集
1,2,2,3,2,1,2,2,2
我查找子数组并计算每个子数组的频率。我首先从一些K
length子数组(例如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
。
我的问题是处理存在多个父子集的情况。我不认为我的结果集中的子数组的频率是1。例子:
1,2,3,1,2,3,1,2,2,3
这里,1,2,3
的计数是2
2,3,1
的计数为2
现在,当我查找count of2,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,X,2,2,3
其中X表示标记位置。现在,根据未标记的位置,我们看到的2,3
的频率为1。因此,基本上,我标记了在当前步骤中找到的所有模式引用。对于下一步,我开始从未标记的位置查找模式,以获得正确的计数
我处理的是大量数据,在这些数据上做这件事似乎有点不太好。而且,我不确定它是否正确。任何其他方法或想法都会有很大帮助吗 为给定数组生成
若要计算具有给定长度的所有重复子数组,请遍历此后缀数组,按所需前缀长度比较相邻后缀。第一个例子
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)< /代码>开始,只使用二进制搜索来获得第一个和最后一个索引(如<代码> STD:上界和
对于后缀数组中第一次和最后一次出现的
的相同示例索引是0和1,因此count是(1,2)
最后一次+1=2
2,3
的计数应该是1?在第二个示例中,如果您看到,2,3的计数是3。但在长度为3“1,2,3”的子阵列中已经出现了2次。(1,2,3),(1,2,3),1,2,2,2,3. 因此,最后的2,3只在计数中出现,但2,3也是2,3,1和2,2,3的子数组。为什么你只对1,2,3感兴趣?@algrid编辑。(2,3)的计数应为1,因为所有较大长度的双亲(1,2,3)和(2,3,1)都覆盖了这些事件。我不认为子数组的计数是1。如果我尝试建立第一个例子的后缀数组,其中数组是1,2,2,3,2,1,2,2,2,那么后缀数组将是5,0,9,8,7,6,4,2,1,3。现在如何计算任何子阵列的出现次数?例如,如果我想计算1,2。是否查找以(1,2)开头的所有后缀?举个例子会很有帮助。我已经添加了更多的解释。