[英]Given the co-ordinates of n points in 2-D plane, find the number of triplets that form right triangle
我可以通过蛮力,通过逐个选择所有三胞胎并检查它们是否形成直角三角形来做到这一点。 但是什么可能是更优化的方式? 我什么都想不到。
编辑:既然你们中的一些人指出了另一个看似与此问题类似的问题,我会仔细阅读答案,但我仍然无法弄清楚如何使用这些答案来解决这个问题。
这将在O(n^2Log(n))
。
Algo :
创建2D阵列 Slope
,其中Slope[i,j]
是coordinate[i]
和coordinate[j]
之间的斜率矢量。
现在,为了使coordinate[i]
成为直角三角形的关节 (见注2), Slope[i,....]
应该有两个相互正交的Slope[i,....]
,即它们的点积为0 。
如果Slope[i,j] = (a,b)
(in vector form)
,那么你必须在Slope[i,....]
寻找(b,-a)
或(-b,a)
。
要使搜索优化,请将数组Slope[i,...]
排序在a
或b
。 排序将花费O(nlogn)
时间。
现在,对于任何Slope[i,j]
,进行二进制搜索以在数组中查找(b,-a)
和(-b,a)
。
所有n
斜率的二进制搜索将花费O(nlogn)
时间。
所以,总时间复杂度 :
= Calculate slope between all points + Sort the slopes + BinarySearch
= O(n*(n+nlogn+nlogn)) = O(n^2log(n))
注意 :
确保标准化斜率向量,即:
coordinate_a = (p,q) coordinate_b = (r,s) slope_vector(a,b) = (pr,qs)/distance(a,b)
直角三角形的关节:两个正交边之间的公共坐标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.