【问题标题】:What is the complexity of this approach to finding K largest of N numbers这种找到 N 个数中最大的 K 个的方法的复杂性是多少
【发布时间】:2017-07-02 17:58:28
【问题描述】:

this post on how to find the K largest of N elements 中提出的第二种方法是:

  1. 将前 k 个元素存储在临时数组 temp[0..k-1] 中。
  2. 在 temp[] 中找到最小的元素,让最小的元素为 min。
  3. 对于 arr[k] 到 arr[n-1] 中的每个元素 x 如果 x 大于 min,则从 temp[] 中删除 min 并插入 x。
  4. 打印 temp[] 的最后 k 个元素

虽然我了解这种方法,但我不了解他们的计算 O((n-k)*k) 的时间复杂度。

从我的角度来看,您正在对 n-k 元素进行线性遍历,并对每个元素进行一次比较。然后可能会替换 K 元素的临时数组中的一个元素。

更具体地说,他们计算的*k 方面在哪里? O((n-k)*k)的时间复杂度来自哪里?为什么他们会乘以 n-k

【问题讨论】:

  • 可能是因为您必须将临时数组 (k) 的每个元素与初始数组 (n - k) 的每个剩余元素进行比较,即 k * (n - k)。看来算法描述有点错误,因为如果我没记错的话,你必须重复步骤#2和#3:)
  • 使用最大堆来存储数字,那么总复杂度将是O(n) 用于构建堆,O(k*lg(n)) 用于查找 k 最大元素。
  • @SandipanDey 或更好的是为第一个 k 元素构建最小堆,然后为 执行 (nk) 插入和删除分钟(nk)logk 时间,然后执行 k find-mins 和 delete-mins 另一个 klogk 总共 nlogk 时间。

标签: algorithm sorting


【解决方案1】:

让我们考虑kth iteration

arr[k] > min(temp[0..k-1]

现在您将用arr[k] 替换min(temp[0..k-1])

现在您再次需要计算 temp[0..k-1], 的更新后的 min,因为那会发生变化。它可以是您更新的temp[0..k-1] 中的任何数字

所以在最坏的情况下,你每次都更新最小值,因此O(k)

因此,时间复杂度 = O((n-k)*k)

【讨论】:

    猜你喜欢
    • 2015-08-05
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多