假设我们在某种程度上有一个具有聚类效果的数组,例如
1 2 3 7 8 12 13 16 20 21 22 23
我们如何以数学方式表示这类数据? 如果我们有这样的其他数组
1 2 10 11 20 21
这两个数组的交集是
1 2 20 21
注意到我们处于这样的情况:我们有一个完全并行的算法来计算这种两个数组的交集,我们想分析数学约定中的成本。该算法是关于在较长的一个中对短阵列的每个元素进行二进制搜索。
我们为GPU设计了一些算法,速度非常快。我们发现具有这种聚类效应的算法在数据上更快。现在我们想要分析这些数据的算法,但我们不知道这样做。
是否有类似随机过程或 还有什么可以帮助计算成本的预期吗?
答案 0 :(得分:0)
我不知道完全并行算法是什么意思,但由于数组是排序的,你可以做一个时间复杂度为O(m + n)的顺序算法,其中m和n是数组长度:
int i = 0, j = 0;
while (i < array1.length && j < array2.length) {
if (array1[i] == array2[j]) {
add array1[i] to the intersection list
++i;
++j;
} else if (array1[i] < array2[j]) {
++i;
} else {
++j;
}
}
这假定数组包含唯一值。如果可能重复某个值,则需要更好地定义问题,以确定交叉数组的构成。
通过二进制搜索可以加快算法速度,而不是在找不到匹配时简单地递增i或j。将需要一个二进制搜索,用于报告在找不到元素时应插入的位置。 (只报告失败的人会浪费时间。)
答案 1 :(得分:0)
遍历数组并找出每对(0,1; 1,2; ...)之间的差异。计算1的数量并将其除以n-1。这将给你连续对的百分比。这是一个原始指标。
primitive_metric:
values = [1,2,3,4,5,8,9,10]
values_length = 8
consecutive = 0
for i=0 to values_length - 1:
consecutive += ((values[i+1] - values[i]) == 1) ? 1 : 0
return consecutive/(values_length-1)