gpt4 book ai didi

algorithm - 找到覆盖空间中最多点的圆

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:30:01 26 4
gpt4 key购买 nike

我正在接受一家高频交易公司的面试。他们问我一个O(n)的算法:

  • 给定 n 个空间点
  • 给定一个散列函数,该函数返回 O(1) 中的平面点,
  • 找到一个覆盖空间中最多点的最佳匹配圆。

要求:

  • 圆心的坐标必须是整数,半径为 3
  • 圆内的点不一定有整数坐标

我用谷歌搜索并做了一些研究。有一个O(n) 算法(普林斯顿大学 Chazelle 的最佳圆圈放置),但它有点超出我的水平,无法理解并将其放在一起在 10 分钟内解释。我已经知道 O(n^2)O(n^3) 算法。

请帮我找到一个O(n) 算法。

最佳答案

我想整数坐标约束可以显着简化问题。这对我来说看起来像 O(n):

-制作一个空间中所有整数点的字典,并将条目设置为0。

-对于每个数据点,找到半径为3以内的整数点,并将1添加到字典的相应条目中。这样做的原因是,可以作为特定数据点所在圆心的点集是围绕该数据点具有相同半径的圆的整数限制。搜索可以在长度为 6 的正方形上的所有点上完成(认为并非所有点都需要明确评估,因为内切超立方体内部的点肯定在内部)。

-返回字典最大值对应的整数点,即大部分数据点在圆内的圆心。

编辑:我想一些代码比解释更好。这是 python 与 numpy 和 matplotlib 一起工作。不应该太难读:

# -*- coding: utf-8 -*-
"""
Created on Mon Mar 11 19:22:12 2013

@author: Zah
"""

from __future__ import division
import numpy as np
import numpy.random
import matplotlib.pyplot as plt
from collections import defaultdict
import timeit
def make_points(n):
"""Generates n random points"""
return np.random.uniform(0,30,(n,2))

def find_centers(point, r):
"""Given 1 point, find all possible integer centers searching in a square
around that point. Note that this method can be imporved."""
posx, posy = point
centers = ((x,y)
for x in xrange(int(np.ceil(posx - r)), int(np.floor(posx + r)) + 1)
for y in xrange(int(np.ceil(posy - r)), int(np.floor(posy + r)) + 1)
if (x-posx)**2 + (y-posy)**2 < r*r)
return centers


def find_circle(n, r=3.):
"""Find the best center"""
points = make_points(n)
d = defaultdict(int)
for point in points:
for center in find_centers(point, r):
d[center] += 1
return max(d , key = lambda x: d[x]), points

def make_results():
"""Green circle is the best center. Red crosses are posible centers for some
random point as an example"""
r = 3
center, points = find_circle(100)
xv,yv = points.transpose()
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_aspect(1)
ax.scatter(xv,yv)
ax.add_artist(plt.Circle(center, r, facecolor = 'g', alpha = .5, zorder = 0))
centersx, centersy = np.array(list(find_centers(points[0], r))).transpose()
plt.scatter(centersx, centersy,c = 'r', marker = '+')
ax.add_artist(plt.Circle(points[0], r, facecolor = 'r', alpha = .25, zorder = 0))
plt.show()

if __name__ == "__main__":
make_results()

结果: Result figure绿色圆圈是最好的,红色的东西展示了如何为一些随机点选择中心。

In [70]: %timeit find_circle(1000)
1 loops, best of 3: 1.76 s per loop

In [71]: %timeit find_circle(2000)
1 loops, best of 3: 3.51 s per loop

In [72]: %timeit find_circle(3000)
1 loops, best of 3: 5.3 s per loop

In [73]: %timeit find_circle(4000)
1 loops, best of 3: 7.03 s per loop

在我非常慢的机器上。行为显然是线性的。

关于algorithm - 找到覆盖空间中最多点的圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15305833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com