【发布时间】:2021-09-18 20:15:27
【问题描述】:
当涉及到使用 Python 进行算法设计时,我正在努力解决时间复杂度问题。
我的任务是编写一个满足以下要求的函数:
- 必须是线性 O(n) 时间
- 必须从随机数列表中返回第 n 个最小的数
我在网上找到了以下示例:
def nsmallest(numbers, nth):
result = []
for i in range(nth):
result.append(min(numbers))
numbers.remove(min(numbers))
return result
据我了解,Big-O 是一个近似值,在分析时间复杂度时只考虑函数的主要部分。
所以我的问题是:
在循环中调用 min() 会影响时间复杂度,还是因为 min() 在 O(n) 时间内执行,所以函数保持 O(n)?
此外,是否会添加另一个循环(非嵌套)以进一步解析特定数字的结果列表,即使每个循环包含两个或三个以上的常量操作,也可以使算法保持线性时间?
【问题讨论】:
-
如果你在 O(n) 循环中有一个 O(n) 操作,它将是 O(n^2)。附带说明:调用
min(numbers)两次不会改变时间复杂度,但会使您的代码变慢。 -
只是提示,您正在寻找Selection algorithm。
-
heapq.nsmallest(numbers, nth) -
他的任务是编写它,而不是从库中调用解决方案,所以在我看来 heapq 并不是真的有用..
标签: python algorithm data-structures big-o