如何找到包含一组模N的最小区间?

时间:2009-07-10 20:12:21

标签: algorithm language-agnostic

首先是导致我遇到问题的实际应用:

给定一组角度测量值v[i],范围为[0,360]度, 什么是包含所有v[i]?

的最小间隔

注意:间隔可能在两侧,大约在0附近。

问题的抽象描述:

对于给定的一组值v[i],值cd是什么,

  • 适用于所有idist(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是值的数量)?

4 个答案:

答案 0 :(得分:5)

嗯,关注如何:

  1. 将所有角度归一化为[0,N)
  2. 排序角度(最小值)
  3. 找到最大距离的neigborung对:
    3.1你需要总是减去(下一个 - 前一个)
    3.2最后一对应该是(最后一个;第一个+ N)
  4. 认为对是你需要的 - 只使用与你在步骤3中找到的角度相反的角度。
  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