📅  最后修改于: 2023-12-03 14:54:36.451000             🧑  作者: Mango
在一个二维平面上给定一组点的坐标,任务是找到距离原点最近的 K 个点。
一个简单的解决方法是计算每个点到原点的距离,然后按照距离进行排序,最后选择前 K 个点作为结果。下面是一个使用 Python 实现的示例代码片段:
import math
def distance(x, y):
# 计算点 (x, y) 到原点的距离
return math.sqrt(x**2 + y**2)
def k_closest(points, k):
# 计算每个点到原点的距离
distances = [(distance(x, y), (x, y)) for x, y in points]
# 根据距离排序
distances.sort()
# 取前 K 个点作为结果
return [point for _, point in distances[:k]]
下面是一个例子,展示了如何使用上述代码片段找到距离原点最近的 3 个点:
points = [(1, 2), (-3, 4), (5, -6), (7, 8)]
k = 3
result = k_closest(points, k)
print(result) # 输出:[(1, 2), (-3, 4), (5, -6)]
上述解决方法的时间复杂度较高,可以使用堆来优化寻找最近的 K 个点的过程。下面是一个使用 Python 的 heapq 模块实现的示例代码片段:
import math
import heapq
def distance(x, y):
# 计算点 (x, y) 到原点的距离
return math.sqrt(x**2 + y**2)
def k_closest(points, k):
# 使用堆来保存最小的 K 个距离
closest_points = []
for point in points:
x, y = point
dist = distance(x, y)
heapq.heappush(closest_points, (dist, point))
# 如果堆的大小超过 K,移除最大的距离
if len(closest_points) > k:
heapq.heappop(closest_points)
# 返回堆中的 K 个点
return [point for _, point in closest_points]
这种方法通过使用堆来维护最小的 K 个距离,避免了显式的排序操作。
下面是一个例子,展示了如何使用上述优化方法找到距离原点最近的 3 个点:
points = [(1, 2), (-3, 4), (5, -6), (7, 8)]
k = 3
result = k_closest(points, k)
print(result) # 输出:[(1, 2), (-3, 4), (5, -6)]