是否有一些数学方法来表示这种数据?

时间:2012-05-25 03:27:46

标签: algorithm

假设我们在某种程度上有一个具有聚类效果的数组,例如

1 2 3 7 8 12 13 16 20 21 22 23

我们如何以数学方式表示这类数据? 如果我们有这样的其他数组

1 2 10 11 20 21

这两个数组的交集是

1 2 20 21

注意到我们处于这样的情况:我们有一个完全并行的算法来计算这种两个数组的交集,我们想分析数学约定中的成本。该算法是关于在较长的一个中对短阵列的每个元素进行二进制搜索。

我们为GPU设计了一些算法,速度非常快。我们发现具有这种聚类效应的算法在数据上更快。现在我们想要分析这些数据的算法,但我们不知道这样做。

是否有类似随机过程或 还有什么可以帮助计算成本的预期吗?

2 个答案:

答案 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)