Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 子阵计数_Arrays_Algorithm_Count_Subset_Sub Array - Fatal编程技术网

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 of
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,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:上界和STD:Cult+Load < /Case> C++中的操作)。


对于后缀数组中第一次和最后一次出现的
(1,2)
的相同示例索引是0和1,因此count是
最后一次+1=2

不太清楚您到底在计算什么-为什么要从C2中减去C1?为什么在第二个示例中,
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)开头的所有后缀?举个例子会很有帮助。我已经添加了更多的解释。