【发布时间】:2017-07-02 17:58:28
【问题描述】:
在this post on how to find the K largest of N elements 中提出的第二种方法是:
- 将前 k 个元素存储在临时数组 temp[0..k-1] 中。
- 在 temp[] 中找到最小的元素,让最小的元素为 min。
- 对于 arr[k] 到 arr[n-1] 中的每个元素 x 如果 x 大于 min,则从 temp[] 中删除 min 并插入 x。
- 打印 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 时间。