如何找到由n个点中选出的三个点确定的最小和最大角度?

时间:2017-04-06 14:00:31

标签: algorithm math geometry mathematical-optimization

在二维平面中给出 n 点,如(0,0),(1,1),......我们可以从中选择任意三个点来构造角度。例如,我们选择 A (0,0), B (1,1), C (1,0),然后我们得到角度 ABC = 45度, ACB = 90度, CAB = 45度。

我的问题是如何计算由 n 点中选出的三个点确定的最大或最小角度。

显然,我们可以使用蛮力算法 - 计算所有天使并找到最大值和最小值,使用余弦定律计算角度和毕达哥拉斯定理来计算距离。但高效算法是否存在?

1 个答案:

答案 0 :(得分:0)

如果我是正确的,暴力在O(n ^ 3)中运行:你基本上采取每个三元组,计算3个角度,并存储整体最大值。

你可以略微提高到O(n ^ 2 * log(n)),但它更棘手:

best_angle = 0
for each point p1:
    for each point p2:
        compute vector (p1, p2), and the signed angle it makes with the X-axis
        store it in  an array A
    sort array A    # O(n * log(n))
    # Traverse A to find the best choice:
    for each alpha in A:
         look for the element beta in A closest to alpha+Pi 
         # Takes O(log n) because it's sorted. Don't forget to take into account the fact that A represents a circle: both ends touch...
        best_angle = max(best_angle, abs(beta - alpha))

复杂性为O(n * (n + nlog(n) + n * log(n))) = O(n^2 * log(n))

当然你也可以检索在循环过程中获得最佳角度的pt1,pt2。

可能还有更好的感觉,即使您重复使用先前的pt1计算pt2,...,ptn ......感觉就像做了太多的工作一样...