找到数组中角度之间的最大差异

时间:2013-09-29 05:23:08

标签: algorithm math accelerometer

我正在处理一些加速度计数据,这些数据的值介于-180和180之间。以度为单位表示角度。

是否有一种聪明的算法可以找到任意两个角度之间的最大差异?

3 个答案:

答案 0 :(得分:3)

为了担心它,应该有很多角度。但可以肯定的是,你可以击败O(n ^ 2)

对数组进行排序。使用指针ab逐步完成。首先找到距离b最大角度的a并将其存储到best。然后重复前进a一步b,直到它停止增加差异为止。您将遍历列表大约1.5倍,以O(n)为界,因为b无法超越a。所以它并不比排序所需的时间更糟糕。

答案 1 :(得分:1)

如果在[0,180]中,则表示角度为正,如果在[-180,0]中,则为负值。

扫描列表,执行以下操作:
1记录最大和最小正角度 2记录最大和最小负角度
3如果角度是正角度,将其转换(让它减去180)为负角度,并用一些标记标记它以表明它来自转换

对于#1,最大差异只是最大角度减去最小角度。对于#2也是如此。

对于#3,首先排序角度。从排序列表的末尾扫描。如果相邻角度是不同类型(一个来自转换,一个不是),则计算差异。如果差异是有史以来最小的,记录它,并继续扫描。完成后,使用180 - 差异,让结果为差异#3。

现在你有3个不同,选择最大的一个。我认为这就是答案。

对于复杂性,所有扫描都是O(n)。对于排序,如果所有角度都是正的或负的,则根本不需要阶段#3。如果需要阶段#3,我们可以让它具有更小的角度。例如,如果列表具有较小的正角度,我们可以将正转换为负,反之亦然。排序是O(nlgn),但我们可以有更小的n。

答案 2 :(得分:0)

从RW教程中得到了这个。

它与你想要的相反(返回最小的角度),但你可以调整它。

// Returns shortest angle between two angles,
// between -M_PI and M_PI

static inline CGFloat ScalarShortestAngleBetween(const CGFloat a, const CGFloat b)
{
    CGFloat difference = b - a;
    CGFloat angle = fmodf(difference, M_PI * 2);
    if (angle >= M_PI)
    {
        angle -= M_PI * 2;
    }
    return angle;
}