【问题标题】:Construct an O(n) average case algorithm to find closest m points from a list of n points构造一个 O(n) 平均情况算法以从 n 个点的列表中找到最近的 m 个点
【发布时间】:2021-12-07 14:32:22
【问题描述】:

我们需要构造一个算法,给定一个笛卡尔平面中n个点的列表,其中离原点最近的m(m不是常数,小于等于n)点。这个算法需要在 O(n) 平均时间内工作,这是我一直在努力解决的问题。

我最初的想法是根据每个点与原点的距离对列表进行排序,然后从排序列表中选择前 $m$ 个点。然而,我所知道的所有排序算法都在 O(nlogn) 平均时间内工作。有没有其他方法可以做到这一点,使用笛卡尔平面的属性?

感谢您的帮助。

【问题讨论】:

  • 计算到每个点的距离。然后使用快速选择找到最近的点。
  • 我们需要打印m个最近的点,小于等于n。平均而言,快速选择 m 个项目需要 O(n^2) 时间,不是吗?
  • 您可以在 O(n log m) 时间内使用堆来完成此操作。堆总是包含迄今为止找到的 m 个最近点。
  • 快速选择的工作原理是将m-1 较小的元素放在第 m 个最小元素的左侧,其余元素放在右侧。因此,当快速选择完成时,数组中的第一个 m 元素是最小的 m 元素。它们只是没有任何特定的顺序。这就是它比排序更快的原因。
  • @Attila1177298 很高兴为您提供帮助:)

标签: algorithm sorting time-complexity complexity-theory


【解决方案1】:

使用QuickSelect 算法找到离原点最近的第 m 个点。这会将列表分成最近的 m 个点,然后是更远的点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多