我在高频贸易公司接受采访时,他们问我
在2D平面中找到一个长度为R且给定n个点的正方形
条件:
- 轴的平行边 它包含n个点中的至少5个
运行复杂性与R
无关 他们告诉我给他们O(n)算法答案 0 :(得分:4)
有趣的问题,感谢发帖!这是我的解决方案。感觉有点不雅,但我认为它符合问题的定义:
输入:R
,P = {(x_0, y_0), (x_1, y_1), ..., (x_N-1, y_N-1)}
输出:(u,v)
,使得包含(u,v)
和(u+R, v+R)
的方格至少包含来自P
的5个点,如果不存在(u,v)
,则为NULL
约束:渐近运行时间应为O(n)
考虑使用RxR
方块平铺平面。构造一个稀疏矩阵,B
定义为
B[i][j] = {(x,y) in P | floor(x/R) = i and floor(y/R) = j}
在构建B
时,如果找到包含至少五个元素的条目,则为包含五个点的矩阵条目的(u,v) = (i*R, j*R)
停止并输出i,j
。
如果B
的构造没有产生解,那么要么没有解决方案,要么边长为R
的正方形不与我们的平铺对齐。为了测试第二种情况,我们将考虑来自四个相邻图块的点。
迭代B
中的非空条目。对于每个非空条目B[i][j]
,请考虑由条目本身以及上方和右侧的区块表示的区块中包含的点集合。这些是条目中的点:B[i][j], B[i+1][j], B[i][j+1], B[i+1][j+1]
。此集合中不能超过16个点,因为每个条目必须少于5个。检查此集合并测试此集合中满足问题标准的点中是否有5个点;如果是这样,停止并输出解决方案。 (我可以更详细地指定这个算法,但是因为(a)这样的算法显然存在,并且(b)它的渐近运行时是O(1)
,我不会详细说明。
如果在迭代B
中的条目后没有找到解决方案,则输出NULL。
B
的构建仅涉及P
的一次传递,因此为O(N)
。 B
只有N
个元素,因此迭代它是O(N)
。 B
中每个元素的算法考虑不超过16个点,因此不依赖于N
且O(1)
,因此整体解决方案符合O(N)
目标。< / p>
答案 1 :(得分:1)
运行set一次,将(最大的)x值保存在(已排序的)本地数组中。维护排序的本地阵列是O(N)(最多执行N次的恒定时间)。
将xMin和xMax定义为分别具有最大和第5个最大x值的两个点的x坐标(即(a [0]和[4])。
再次对Y值排序[],并在常数时间内再次设置yMin和yMax。
定义deltaX = xMax-xMin,deltaY为yMax-yMin,R = deltaX和deltaY的最大值。
位于右上角(xMax,yMax)的边长R的平方符合标准。
观察R是否事先得到修复: