【问题标题】:Python algorithms and Big-O [duplicate]Python算法和Big-O [重复]
【发布时间】:2021-09-18 20:15:27
【问题描述】:

当涉及到使用 Python 进行算法设计时,我正在努力解决时间复杂度问题。

我的任务是编写一个满足以下要求的函数:

  1. 必须是线性 O(n) 时间
  2. 必须从随机数列表中返回第 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


【解决方案1】:

在循环中调用 min() 会影响时间复杂度,还是因为 min() 在 O(n) 时间内执行,所以函数仍然是 O(n)?

是的。 min() 需要 O(N) 时间来运行,如果你在一个运行 O(N) 时间的循环中使用它,那么现在总时间是 - O(N^2)

此外,是否会添加另一个循环(非嵌套)以进一步解析特定数字的结果列表,即使每个循环包含两个或三个以上的常量操作,也可以使算法保持线性时间?

取决于你的循环做什么。由于您没有提到该循环的作用,因此很难猜测。

【讨论】:

    【解决方案2】:

    min() 复杂度是O(n)(线性搜索)
    list.remove() 删除也是O(n)
    所以,每个循环都是O(n)
    您正在使用它k 次(并且k 可以达到n),因此结果复杂度将是O(n^2) (O(kn))。

    描述了您正在寻找的最坏情况线性时间算法的想法here(例如)。

    kthSmallest(arr[0..n-1], k)

    1. 将 arr[] 分成 ⌈n/5⌉ 组,其中 每组的大小为 5,除了可能有的最后一组 少于 5 个元素。
    2. 对上面创建的⌈n/5⌉组进行排序,找到 所有组的中位数。创建一个辅助数组“median[]”并存储 此中位数数组中所有 ⌈n/5⌉ 组的中位数。 // 递归调用 这种方法找到中位数[0..⌈n/5⌉-1]
    3. medOfMed = kthSmallest(中位数[0..⌈n/5⌉-1], ⌈n/10⌉)
    4. 分区 arr[] 周围 medOfMed 并获取其位置。 pos = partition(arr, n, medOfMed)
    5. 如果 pos == k 返回 medOfMed 6) 如果 pos > k 返回 kthSmallest(arr[l..pos-1], k) 7) 如果 pos

    【讨论】:

    • 谢谢!我对我正在使用的教科书中用于确定时间复杂度的方法感到有些困惑。这将是二次时间。感谢您的指导!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2023-03-31
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多