给定 n 的不同点的 P = {p 1 ,...,p n } 2 行,编写一个算法,在最坏的情况下找到具有最低斜率(最小绝对值)且具有O(n*log(n))
时间复杂度的行。
答案 0 :(得分:6)
根据y位置对点进行排序(使用任意数量的众所周知的算法,n log n time)。按顺序浏览列表,从0到n - 1,比较每个点对的斜率与您发现的任何斜率到目前为止的最低斜率。 (那是时间)。
总的来说,那就是O(n log n)。
在伪代码中:
Let P be the list of points (this list starts at 1)
n = P.length
S = quicksort("a.y < b.y", P) // or some other O(n log n) algorithm
bestSlope = float.inf
let p1 and p2 be points
for i = 1 to n-1:
currSlope = abs((P[i].y - P[i+1].y) / (P[i].x - P[i+1].x))
if currSlope < bestSlope:
bestSlope = currSlope
p1 = P[i]
p2 = P[i+1]
答案 1 :(得分:6)
定理:
证明(矛盾):
根据这个定理,您可以清楚地使用@ Zshazz算法找到正确的对 - 因为它们将是最近邻居 - O(n*log n)
。