当前位置: 首页 > 面试题库 >

请你说一说Top(K)问题?

欧阳嘉年
2023-03-14
本文向大家介绍请你说一说Top(K)问题?相关面试题,主要包含被问及请你说一说Top(K)问题?时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

1、直接全部排序(只适用于内存够的情况)

当数据量较小的情况下,内存中可以容纳所有数据。则最简单也是最容易想到的方法是将数据全部排序,然后取排序后的数据中的前K个。

这种方法对数据量比较敏感,当数据量较大的情况下,内存不能完全容纳全部数据,这种方法便不适应了。即使内存能够满足要求,该方法将全部数据都排序了,而题目只要求找出top K个数据,所以该方法并不十分高效,不建议使用。

2、快速排序的变形 (只使用于内存够的情况)

这是一个基于快速排序的变形,因为第一种方法中说到将所有元素都排序并不十分高效,只需要找出前K个最大的就行。

这种方法类似于快速排序,首先选择一个划分元,将比这个划分元大的元素放到它的前面,比划分元小的元素放到它的后面,此时完成了一趟排序。如果此时这个划分元的序号index刚好等于K,那么这个划分元以及它左边的数,刚好就是前K个最大的元素;如果index > K,那么前K大的数据在index的左边,那么就继续递归的从index-1个数中进行一趟排序;如果index < K,那么再从划分元的右边继续进行排序,直到找到序号index刚好等于K为止。再将前K个数进行排序后,返回Top K个元素。这种方法就避免了对除了Top K个元素以外的数据进行排序所带来的不必要的开销。

3、最小堆法

这是一种局部淘汰法。先读取前K个数,建立一个最小堆。然后将剩余的所有数字依次与最小堆的堆顶进行比较,如果小于或等于堆顶数据,则继续比较下一个;否则,删除堆顶元素,并将新数据插入堆中,重新调整最小堆。当遍历完全部数据后,最小堆中的数据即为最大的K个数。

4、分治法

将全部数据分成N份,前提是每份的数据都可以读到内存中进行处理,找到每份数据中最大的K个数。此时剩下NK个数据,如果内存不能容纳NK个数据,则再继续分治处理,分成M份,找出每份数据中最大的K个数,如果M*K个数仍然不能读到内存中,则继续分治处理。直到剩余的数可以读入内存中,那么可以对这些数使用快速排序的变形或者归并排序进行处理。

5、Hash法

如果这些数据中有很多重复的数据,可以先通过hash法,把重复的数去掉。这样如果重复率很高的话,会减少很大的内存用量,从而缩小运算空间。处理后的数据如果能够读入内存,则可以直接排序;否则可以使用分治法或者最小堆法来处理数据。

 类似资料:
  • 本文向大家介绍请你来说一说协程?相关面试题,主要包含被问及请你来说一说协程?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1、概念: 协程,又称微线程,纤程,英文名Coroutine。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 例如: 由协程运行结果可能是12x3yz。在执行A的过程中,可以随时中断,去执行B,B也可能在

  • 本文向大家介绍请你说一说epoll原理?相关面试题,主要包含被问及请你说一说epoll原理?时的应答技巧和注意事项,需要的朋友参考一下 调用顺序: int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struc

  • 本文向大家介绍请你说一说C++两种map?相关面试题,主要包含被问及请你说一说C++两种map?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: unordered_map(哈希表)和map(红黑树)

  • 本文向大家介绍请你说一说HTTP返回码相关面试题,主要包含被问及请你说一说HTTP返回码时的应答技巧和注意事项,需要的朋友参考一下 参考回答: HTTP协议的响应报文由状态行、响应头部和响应包体组成,其响应状态码总体描述如下: 1xx:指示信息--表示请求已接收,继续处理。 2xx:成功--表示请求已被成功接收、理解、接受。 3xx:重定向--要完成请求必须进行更进一步的操作。 4xx:客户端错误

  • 本文向大家介绍请你来说一说http协议相关面试题,主要包含被问及请你来说一说http协议时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1)HTTP协议: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。   HTTP是一个基于TCP/IP通信协议来

  • 本文向大家介绍请你说一说三次握手相关面试题,主要包含被问及请你说一说三次握手时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1.客户端发送syn0给服务器 2.服务器收到syn0,回复syn1,ack(syn0+1)