1

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

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++ 编写这个,但对我来说重要的是要使用的算法。任何的想法?

4

2 回答 2

7

使用线性回归。根据产生的斜率,您可以决定它是增加还是减少。

来自维基百科的线性回归示例

至于循环情况:我只需将“否定”元素移动到列表前面,然后进行测试......

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

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

如果不知道更多你想要达到的目标,很难给出一个好的答案。

于 2012-04-23T13:47:00.587 回答
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。如果您边做边做,您可以将最终值与第一个值进行比较,以查看这些值是否普遍增加。

于 2012-04-23T13:43:05.847 回答