为算法提供n log n时间下限,以检查一组点是否具有特殊点k。
k定义为:
对于A组点,如果对于A中的每个点m,在A中存在点q使得k位于线段mq的中间,这样ak不必属于A.
例如,对于一组四个点(1,0),(0,1),(1,1),(0,0),该集合有一个特殊点k =(0.5,0.5)。 / p> 当他们问我这个时,我完全被扑克所面对,没有想到什么。我想它需要一些强大的几何背景。
答案 0 :(得分:8)
O(nlogn)
解决方案(我还不清楚你为什么要寻找一个较低的绑定解决方案。你也可以做一个详尽的检查,然后运行一个nlogn循环以确保下限。不是很困难。我认为你必须意味着上限):
通过平均所有点找到唯一有效的候选点。即总结他们的坐标并除以分数。如果存在这样的k,就是这样。如果不存在这样的k,我们会发现在最后一步中找到的点无效。
创建一个新的点阵列(集合),我们将轴移动,使它们以点k为中心。即如果k =(x k ,y k ),则点(x,y)将变为(xx k ,yy k 子>)。根据比率x / y和范数sqrt(x 2 + y 2 )对点进行排序。正如下一步所示,这种分类是如何完成无关紧要的,即哪个是主要标准,哪个是次要标准。
我们可以搜索每个点的补码,或者更好,只需遍历数组并验证每两个相邻的点确实是补码。即如果这是一个解决方案,那么这个新数组中的每两个互补点的形式为(x,y)和(-x,-y),因为我们将轴重新定中心,这意味着它们具有相同的比率(“渐变”) )和规范,并在排序后,必须相邻。
如果k无效,那么我们将在此遍历中找到一个点,并发现它的邻居不是正确的/互补的形式==>没有这样的k。
时间=
O(n)
用于找到候选人k +
O(n)
用于构建新数组,因为每个新点都可以用O(1)+
来计算
O(nlogn)
排序+
O(n)
用于验证遍历
= O(nlogn)
答案 1 :(得分:1)
我会说你只是计算质心(首先删除重复)并检查它是否是你的k
。可能导致它O(n log n)
的唯一原因是在指定位置搜索一个点。