【发布时间】: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