刷题 | top k问题

包含排序

sort--排全部

冒泡等--排k个 n*k

快排--nlogn的复杂度,但是是在平均的情况下,最糟糕的情况依然是n方


不含排序

随机选择--用快排的思想,但只递归一边 是On(哼哼,某厂面试官还...)

--以最小k个为例,先把前k个 元素建立一个大顶堆(On),然后从k+1开始遍历,如果小于堆顶则替换,并下沉,最糟糕的复杂度是nlogk


大数据的情况 100亿找1000

ok

mapreduce

1.将100亿个数据分为1000个大分区,每个区1000万个数据
2.每个大分区再细分成100个小分区。总共就有1000*100=10万个分区
3.计算每个小分区上最大的1000个数
4.合并每个大分区的100个小分区,得到1000个大分区,找出每个大分区的前1000个数。
5.合并大分区,得到总的区,找出前1000

hash(如果重复度很高)

1. 去重  (附常识 | hashset去重_tuuzkiii_Tuu的博客-CSDN博客
2. 用堆

 

你可能感兴趣的:(刷题,topk)