【发布时间】:2019-10-10 13:17:05
【问题描述】:
编码任务是here
堆解决方案:
import heapq
class Solution:
def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]:
return heapq.nsmallest(K, points, key = lambda P: P[0]**2 + P[1]**2)
排序解决方案:
class Solution(object):
def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]:
points.sort(key = lambda P: P[0]**2 + P[1]**2)
return points[:K]
根据here的解释,Python的heapq.nsmallest是O(n log(t)),Python的List.sort()是O(n log(n))。但是,我的提交结果显示 sort 比 heapq 快。这怎么发生的?理论上是相反的,不是吗?
【问题讨论】:
-
Big O 完全没有告诉您两种算法在同一数据集上的相对性能。它仅告诉您对于足够大的数据,渐近更快的算法将获胜。你没有使数据足够大。有时不会有足够大的实际数据。 Big O 是一个非常粗略的分析工具。
-
@Gene 谢谢!我一直在想cs95的回答和你的评论有什么关系。如果有足够大的实际数据,用 Python 还是 C 实现还重要吗?
-
所以cs95删除了他的回答以及他与其他人的讨论。 :/ 我在手机上看到了他的讨论。首先,假设原因是 heapq 是在 Python 中实现的,而 sort 是在 C++ 中使用 timsort 实现的。然后有人说确实存在heapq的c ++实现版本。其他的我不记得了,只能等别人解释了。
-
已删除答案的评论:“heapq 是用 C 实现的。它也有一个等效的 Python 代码。我认为问题可能是 heapq 在每次比较时重新评估 key 函数,因为它不像 sort 那样存储一次调用它的结果。 ——丹 D。”
-
你可以试试
dist_points = (x**2 + y**2, x, y for x, y in points)和return [x, y for _, x, y in heapq.nsmallest(K, dist_points)]。不确定这是否会更快。
标签: python algorithm sorting complexity-theory heapq