📌  相关文章
📜  找到距离原点最近的 K 个点(1)

📅  最后修改于: 2023-12-03 14:54:36.451000             🧑  作者: Mango

找到距离原点最近的 K 个点

简介

在一个二维平面上给定一组点的坐标,任务是找到距离原点最近的 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)]
复杂度分析
  • 时间复杂度:该解决方法的时间复杂度为 O(nlogn),其中 n 是给定的点的数量。排序操作需要花费 O(nlogn) 的时间。
  • 空间复杂度:该解决方法的空间复杂度为 O(n),其中 n 是给定的点的数量。需要额外的空间来存储每个点到原点的距离。
更优解决方法

上述解决方法的时间复杂度较高,可以使用堆来优化寻找最近的 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)]
复杂度分析
  • 时间复杂度:该优化方法的时间复杂度为 O(nlogk),其中 n 是给定的点的数量,k 是要找到的最近的点的数量。堆操作的时间复杂度为 O(nlogk)。
  • 空间复杂度:该解决方法的空间复杂度为 O(k),其中 k 是要找到的最近的点的数量。需要额外的空间来存储最小的 K 个距离。