This commit is contained in:
krahets
2023-08-21 19:32:37 +08:00
parent 02ac0aa9fe
commit fb9ace3a95
62 changed files with 291 additions and 254 deletions
+4 -4
View File
@@ -12,9 +12,9 @@ comments: true
## 8.3.1   方法一:遍历选择
我们可以进行 $k$ 轮遍历,分别在每轮中提取第 $1$ , $2$ , $\dots$ , $k$ 大的元素,时间复杂度为 $O(nk)$ 。
我们可以进行下图所示的 $k$ 轮遍历,分别在每轮中提取第 $1$ , $2$ , $\dots$ , $k$ 大的元素,时间复杂度为 $O(nk)$ 。
方法只适用于 $k \ll n$ 的情况,因为当 $k$ 与 $n$ 比较接近时,其时间复杂度趋向于 $O(n^2)$ ,非常耗时。
方法只适用于 $k \ll n$ 的情况,因为当 $k$ 与 $n$ 比较接近时,其时间复杂度趋向于 $O(n^2)$ ,非常耗时。
![遍历寻找最大的 k 个元素](top_k.assets/top_k_traversal.png)
@@ -26,7 +26,7 @@ comments: true
## 8.3.2   方法二:排序
我们可以对数组 `nums` 进行排序,返回最右边的 $k$ 个元素,时间复杂度为 $O(n \log n)$ 。
如下图所示,我们可以对数组 `nums` 进行排序,返回最右边的 $k$ 个元素,时间复杂度为 $O(n \log n)$ 。
显然,该方法“超额”完成任务了,因为我们只需要找出最大的 $k$ 个元素即可,而不需要排序其他元素。
@@ -36,7 +36,7 @@ comments: true
## 8.3.3   方法三:堆
我们可以基于堆更加高效地解决 Top-K 问题,流程如下
我们可以基于堆更加高效地解决 Top-K 问题,流程如下图所示。
1. 初始化一个小顶堆,其堆顶元素最小。
2. 先将数组的前 $k$ 个元素依次入堆。