首先是导致我遇到问题的实际应用:
给定一组角度测量值v[i]
,范围为[0,360]度,
什么是包含所有v[i]?
注意:间隔可能在两侧,大约在0附近。
问题的抽象描述:
对于给定的一组值v[i]
,值c
和d
是什么,
i
:dist(v[i],c) <= d
和d
尽可能小dist(x,y) = abs(((x-y + N/2 + N) mod N) - N/2)
?这在开放(无限)范围内是微不足道的,其中dist(x,y) = abs(x-y)
:
calculate max and min of all v[i]
c = (max + min)/2;
d = (max - min)/2;
但是找到有限尺度的c和d的最佳方法是什么(模N)和 如上所述的距离定义?
有没有办法做到这一点O(n)(如果n是值的数量)?
答案 0 :(得分:5)
嗯,关注如何:
我错了吗?换句话说,我的解决方案是显而易见的 - 你只需要找到馅饼的最大部分并吃掉它......剩下的就是你所需要的。
答案 1 :(得分:0)
我有一个自己的解决方案,但是,我对它不太满意,因为它假设d永远不会大于N / 4:
if(v[0]>=N/4 && v[0]<(3*N)/4)
{
calculate min and max of all v[i]
c = (max + min)/2;
d = (max - min)/2;
}
else
{
calculate min and max of all (v[i] + N/2) % N
c = ((max + min)/2 - N/2;
d = ((max - min)/2 - N/2;
}
任何更好的解决方案,尤其是如果d结果为&gt; N / 4
答案 2 :(得分:0)
您的问题似乎等于找到两个角度之间的最大距离。
你应该能够遍历你的v set,计算每个元素之间的距离,然后找到最大的距离。
你可以尝试这样的距离函数:
void dist_mod_360(int a, int b)
{
const int n = 360;
return min((a - b) % n, (b - a) % n);
}
答案 3 :(得分:0)
angle = max(v) - min(v)
return angle if angle <=180 else 360 - angle # to get the smallest absolute value