arrays - 测量阵列连续性

标签 arrays algorithm

我有数据记录,其中每条记录都是按严格递增顺序排列的不同长度的整数数组。以下是一些示例:

record_1 : 1,2,3,4,5,6,8,9,10
record_2 : 5,30,31,32,33,34,35,36
record_3 : 10,11,12,19,20

我想测量(或给出分数)每个数组的连续性,即数组的每个相邻元素“接近”的程度。目前我正在使用每个相邻数组元素的差之和(伪代码):

for i=2 to length(A) do
    sum_diff += A[i] - A[i-1]
end
score = (length(A) - 1) / sum_diff

因此对于一个完美连续的数组(例如:1,2,3,4,5),分数将为 1(最高分)。

但是对于连续但包含“跳转”的数据会出现问题,例如上面的record_2,存在从5的“跳转” 30

对于上面的数据示例,使用我的算法的分数是:

record_1 : 0.89
record_2 : 0.23
record_3 : 0.4

它给 record_2 的分数低于 record_3,但我们可以直观地看到 record_2 应该有更高的分数得分低于 record_3,因为 record_2 是连续的,除了从 530 的跳转。

那么,有没有人知道我应该如何修改我的算法以提供更好的邻接性测量?先谢谢了。

最佳答案

如果您认为 2 的差距与 10 的差距一样糟糕,那么平均“相差一个”函数:

differenceMeasures[i] = A[i+1] - A[i] == 1 ? 1 : 0
return average of differenceMeasures
// Note that the average will be sum(differenceMeasures)/(n-1) since there's
// one less difference than there is number of array entries in 'A'.

如果您想考虑间隙大小,我建议使用以零为界的单调递减函数,例如往复函数:

differenceMeasures[i] = 1 / A[i+1] - A[i]
return average of differenceMeasures
// When the difference is 1, differenceMeasures gets 1.
// When 2, differenceMeasures gets 1/2. Etc...

在这两个函数中,1 是最佳分数,0 是最差的。如果您不喜欢这样,返回 1 - differenceMeasures 的平均值 就足够了。

关于arrays - 测量阵列连续性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9312366/

相关文章:

algorithm - 以不同角度绘制像素化线

algorithm - 如何判断一棵红黑树是否可以有X个黑色节点和Y个红色节点

arrays - 如何使用 Swift 使用 Firebase GeoFire 查询多个键?

algorithm - 递归 : cut array of integers in two parts of equal sum - in a single pass

c++ - 使用递归对数组进行排序

javascript - 获取Javascript数组的最高索引键

algorithm - 搜索和匹配算法

java - 使用正则表达式 Java 获取重叠模式

arrays - 使用 mongoose 在不同的对象数组中查找对象

javascript - 如何将用户提示(输入)存储到数组中并检索它的最大值和最小值?