Skip to content

Commit e57d84e

Browse files
committed
top k问题
1 parent e1b880d commit e57d84e

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

MD/通用基础-排序算法.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,15 @@
1818
![](https://github.com/xbox1994/2018-Java-Interview/raw/master/images/heapsort.gif)
1919

2020
堆排序过程的最好和最坏时间复杂度是O(nlog<sub>2</sub>n)
21+
22+
## TOP K
23+
如何在N个元素中寻找前K大的数?
24+
25+
快速排序:
26+
27+
* 原理:每次快速排序中的划分过程能找到一个全部大于左边元素的一个值。如果该值的位置等于K,那么这个值和它左边的所有元素就是前K大的数;如果该值的位置小于K,那么对右边的元素继续划分排序;如果该值的位置大于K,那么对左边的元素继续划分排序
28+
* 问题:但空间复杂度是O(N),如果你要在很多元素中找很少几个top K的元素,或者在一个巨大的数据流里找到top K,快速排序是不合适的,堆排序更省地方
29+
30+
堆排序:
31+
* 原理:申请一个容量为K的数组,存入数组的前K个元素,创建长度为K的最小堆;从K开始循环数组的剩余元素,如果元素(a)比最小堆的根节点大,将a设置成最小堆的根节点,然后重建最小堆;循环完成后,最小堆中的所有元素就是需要找的最大的K个元素。
32+
* 优点:可以在N个元素中找到top K,时间复杂度是O(N log K),空间复杂的是O(K)

0 commit comments

Comments
 (0)