algorithm - 给定二维平面中 n 个点的坐标,找出形成直角三角形的三元组的数量

标签 algorithm binary-search

我显然可以通过蛮力来做到这一点,通过一个接一个地选择所有三元组并检查它们是否形成直角三角形。 但是什么是更优化的方式呢?我想不出。

编辑:由于你们中的一些人指出了另一个看起来与这个问题相似的问题,我仔细检查了答案,但我仍然无法弄清楚如何使用这些答案解决这个问题。

最佳答案

这将适用于 O(n^2Log(n)) .

算法:

创建一个二维数组 Slope , 其中Slope[i,j]coordinate[i] 之间的斜率矢量和 coordinate[j] .

现在,对于 coordinate[i]作为直角三角形关节(见注2),Slope[i,....]中应该有两个斜坡它们彼此正交,即它们的点积为 0。

如果Slope[i,j] = (a,b) (in vector form) , 那么你必须寻找 (b,-a)(-b,a)Slope[i,....] .

为了优化搜索,保留数组 Slope[i,...]排序于 ab . 排序需要 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)) 

注意:

  1. 确保对斜率向量进行标准化,即:

    coordinate_a = (p,q) coordinate_b = (r,s) slope_vector(a,b) = (p-r,q-s)/distance(a,b)

  2. 直角三角形的交点:两个正交边之间的公共(public)坐标。

关于algorithm - 给定二维平面中 n 个点的坐标,找出形成直角三角形的三元组的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42538989/

相关文章:

algorithm - 为什么以下两个重复查找算法的时间复杂度不同?

java - (Java) 在另一个数组中搜索一个数组的值的索引

algorithm - 测量稀疏向量与 30k 其他预定义稀疏向量之间的最小角度

algorithm - 为什么 {x <= 10 ^ x < 10} 简化为 {x < 10} 而不是 Hoare 逻辑中的 {x <= 10}?

algorithm - 二维圆矩形碰撞和反射不起作用

c - C中的递归二进制搜索程序

javascript - 没有得到正确的二进制搜索算法

python - 为什么在 python 中使用 Sublime 实现二进制搜索时无法在控制台上获得结果?

c++ - 使用迭代器位置的线性和二进制搜索

java - 二分查找麻烦