老师您好,最近面试过程中遇到了这个问题,求top k 注意这里的 k 是变量,就是说用户可以拿top 任意个数,所以不同于之前计算top k就不能只计算存储top k,老师如果是这种需求我们在设计过程中应该注意什么呢?忘解惑
如果是变量的话还是需要了解一下这个具体的产品场景是什么。从算法角度上说,这个 K 的范围是从 1-N, N 是数据总量的话,我们只能预先做好排序或者维护一个Heap保存所有数据。
感谢老师回我,数字就是1到k, 但是k不是常数,而是变量,比如说用户可以问top 1, top2…top1000000等等,所以最大的区别就是计算时要都算上,没有只存topK 这个说法了,我看到一个解法:
maintain一个top k的Max heap, k是一个比较reasonable的数字,比如1000,5000之类的。如果用户需要的数字比我们这个储存的小,直接从这个heap里面取返回,如果需要比我们maintain的大,就只能compute。比如我们有100个thread来compute, 把data break成100份,每一份算出来的top k再merge起来。超出部分的计算方式通过mapreduce 来做,老师您觉得这个方法可行吗?
要是需要现场算的话,如果 K << N,可以按照你的做法,如果是 K ~= N/2,那可能 sort 更快。
这个 max heap 如何 maintain 呢?是否要存下来max heap中最下的元素?否则如何删除heap中最小的元素?
他的意思应该是 min Heap,存最大的K个数
看着像这道题。 Top K中的K是variable.
https://leetcode.com/problems/design-a-leaderboard/