确定阵列是增加还是减少的最佳方法

时间:2012-04-23 13:32:42

标签: arrays algorithm

给定一个值数组,我想确定它是一个增加还是减少的数组。当然,如果我们只想检测Monotone Increase / Decreasing,这是微不足道的。但如果我们有这样的数组:

3,3.2,3.4,3.3,3.4,3.7,4.2,4.8

确实是一个增加的数组,但不是单调的,因为对于i = 3,我们有3.3 <3.4

此外,对我来说,第一个和最后一个索引之间的单一检查不是一个选项,因为我可能正在处理角度,而且我可以完成多个圆圈:

270º,290º,315º,345º,5º

我会说顺时针也在增加,尽管5º<270º

另外,如果我定义的角度从0到180然后-180到0而不是0到360,这又是一个问题:

170º,175º,180º,-175º,-170º对我来说再次增加。

我想为C ++编写这个,但对我来说重要的是要使用的算法。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

使用linear regression。根据产生的斜率,您可以决定它是增加还是减少。

linear regression example from wikipedia

至于循环案例:我只需移动列表前面的“否定”元素然后进行测试......

注意:对于像5 4 3 2 1 1000这样的特殊情况,这仍然会告诉你它正在增加,但很难给出一个确切的答案,因为“增加”的定义非常模糊。 (您可能希望过滤掉一些疯狂的值?)

另一个简单的方法是计算相邻元素之间的增加和减少的数量,但在这种情况下10 11 12 13 14 0 1 2 3 4会明显增加(这可能是正确的答案,很难说......)

如果不了解你想要达到的目标,就很难给出一个好的答案。

答案 1 :(得分:0)

这是python中的一个例子:

def angles_are_increasing(a):
    first=a[0]
    value=first
    previous=first
    for current in a:
        delta=current-previous
        if delta<180:
            delta+=360
        elif delta>180:
            delta-=360
        value+=delta
        previous=current
    last=value
    return last>first

这个想法是在角度环绕时平滑跳跃,例如将345,5视为345,365。如果你这样做,你可以将你的最终值与第一个值进行比较,看看这些值是否一直在增加。