最近的一组3分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最近的一组3分相关的知识,希望对你有一定的参考价值。
是否有一种已知的,有效的算法,用于在云中找到最接近的三个点组?
这类似于closest pair of points problem,但我正在寻找三分而不是两分。
编辑 “最接近”的定义将影响算法的复杂性。正如Jack指出的那样,找到最小面积三角形是3sum-hard,并且在任何情况下都不适合我的应用。
我希望有一个更有效的算法来找到最小的perimiter(即| AB | + | AC | + | BC |)三角形或类似的东西(例如最小| AB |²+ | AC |²+ | BC |²。我知道没有理由为什么这应该是3sum-hard,因为其他地方存在3个共线点不会影响结果。
注意:我的点有八个维度,因此任何限制为较少维度的算法都不合适。
有一个明显的算法在O(n^2)
工作。
1)执行Delaunay triangluation - O(n log n)
,所以我们得到一个平面图。
因为它是最大化最小角度的Delaunay三角形,很明显最近的3个点必须通过至少2个边连接(但它们不一定需要形成三角形!)。否则会有更近的点或更多的闭合角度。
2)对于每个点(图的顶点),我们检查每对相邻边并查看由这两个边定义的3个顶点。
步骤2)需要多长时间?由于图是平面的,所以number of edges is <= 3n - 6, i.e. O(n)
。所以这一步将在最坏的情况下采用O(n^2)
(典型情况下的O(n)
,其中每个顶点的程度是有限的)。
所以整个算法都是O(n^2)
。请注意,步骤2)是某种天真(强力)解决方案,所以我认为还有一个需要改进的空间(同样,步骤1和2可能会以某种方式合并)。
该问题类似于在一组点中找到最接近的对的经典问题。您可以调整解决最近对问题的最坏情况O(n log n)算法来解决这个问题。
具体问题出现在Google的Code Jam竞赛中。这是分析的简历:
点数可能非常大,因此我们需要一种有效的算法。我们可以使用分而治之来解决O(n log n)时间内的问题。我们将通过垂直线将点集分成两组相等的大小。现在有三种最小周长三角形:它的三个点可以完全在左侧,完全在右侧,也可以使用每个半点。
进一步:
“要找到第三种情况的最小周长(如果它小于p)”:
- 我们选择与垂直分离线相距p / 2的点。
- 然后我们从上到下迭代这些点,并在一个大小为p x p / 2的框中维护所有点的列表,框的下边缘位于最近考虑的点。
- 当我们将每个点添加到框中时,我们使用该点和框中的每对点计算所有三角形的周长。 (我们可以将三角形完全排除在分界线的左侧或右侧,因为已经考虑过这些。)
我们可以证明框中的点数最多为16,因此我们每个点只需考虑一个小的恒定数量的三角形。
在我看来,你甚至可以调整方法在| AB |²+ | AC |²+ | BC |²的情况下工作。
这是k-nearest neighbor问题的一种特定形式,即k = 3。引用的页面没有指定算法的复杂性,但是很明显看到一种简单的方法来计算从选定点到所有其他点的距离,然后计算从该点到所有其他点的距离,以及距离我们对新选择点的原始点是O(nk-1)。考虑伪代码:
for pointB in searchSpace do:
distanceAB := calculateDistance(pointA, pointB)
for pointC in {searchSpace} - {pointB} do:
distanceBC := calculateDistance(pointB, pointC)
distanceCA := calculateDistance(pointC, pointA)
if (distanceAB + distanceBC + distanceCA) < currentMin then:
currentMin := distanceAB + distanceBC + distanceCA
closestPoints := {pointA, pointB, pointC}
请注意,我们假设pointA
已经从searchSpace
中删除。这是一个O(n2)算法。假设尺寸相对较小,或者函数calculateDistance
随尺寸线性增长或减小,这给出了一个适当的时间约束的解决方案。当然可以进行优化,但可能不需要它们。
如果你想看到一些真实的代码,维基百科有many links到implementations。
你提到的问题是3sum难题的变化。有关详细信息,请查看http://www.cs.mcgill.ca/~jking/papers/3sumhard.pdf。
这个问题也可以表示为从给定点找到最小的三角形。
编辑:
基本上,3sum难问题意味着下界是O(n ^ 2)。这里和那里可能会有很小的改进但是没有什么可以做的。
对于这个特定问题(最小三角形),请参阅http://www.cs.princeton.edu/~chazelle/pubs/PowerDuality.pdf的第3章。
以上是关于最近的一组3分的主要内容,如果未能解决你的问题,请参考以下文章
在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]