在二维平面中给出 n 点,如(0,0),(1,1),......我们可以从中选择任意三个点来构造角度。例如,我们选择 A (0,0), B (1,1), C (1,0),然后我们得到角度 ABC = 45度, ACB = 90度, CAB = 45度。
我的问题是如何计算由 n 点中选出的三个点确定的最大或最小角度。
显然,我们可以使用蛮力算法 - 计算所有天使并找到最大值和最小值,使用余弦定律计算角度和毕达哥拉斯定理来计算距离。但高效算法是否存在?
答案 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 ......感觉就像做了太多的工作一样...