给定一个值数组,我想确定它是一个增加还是减少的数组。当然,如果我们只想检测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 ++编写这个,但对我来说重要的是要使用的算法。有什么想法吗?
答案 0 :(得分:6)
使用linear regression。根据产生的斜率,您可以决定它是增加还是减少。
至于循环案例:我只需移动列表前面的“否定”元素然后进行测试......
注意:对于像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。如果你这样做,你可以将你的最终值与第一个值进行比较,看看这些值是否一直在增加。