当数据是流的形式 解决top k 和 select k 快排还是优先队列

当数据是流的形式 解决top k 和 select k 快排还是优先队列

老师您好,

在这小节里你提到,当数据是以流的形式一点一点的传来,这个时候优先队列比快排更适合。这是为什么呢?使用快排也能实时的(对原来的数组和新来的数据进行排序)得到top k和select k的答案。为什么优先队列就更适合呢?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

因为快排需要先知道所有的数据,才能做排序;


数据流的形式,不需要一次性拿到所有的数据,数据是一点一点“流进来的”,每来一个数据,就可以做更新,得到当前的最优结果。


比如要想实时知道当前消费最多的十笔订单。订单是一点一点产生的,这就叫数据流。所以可以使用优先队列的方式,每来一笔订单,更新一下优先队列,得到当前的消费最多的十笔订单。


每来一笔订单,排一次,太慢,等一年所有订单都来了,一起排序,无法满足业务需求。


继续加油!:)

  • 老师你好,对于“每来一笔订单,排一次,太慢”这句话,我是这样理解的。

    当产生一笔新订单时,

    对于快排,需要将新的订单和之前所有订单看做一个数组进行排序,每次partition确定一个有序点后,该有序点与K比较大小,根据情况综合来看下一次partition需要处理的范围会缩小一半,等比数列求和后时间复杂度为o(n)

    对于优先队列,新订单加入堆对应一次shiftUp操作(选用shiftUp因为动态数组addLast时间复杂度0(1)),时间复杂度o(logn)。取出最大值对应一次shiftDown操作,时间复杂度o(logn),综合时间复杂度 o(logn)

    整体来看  o(n) > o(logn),所以使用优先队列解决 来一笔新订单 获取最大值的操作开销更小。

    老师,请问我这样理解对吗

    2024-06-20 13:58:15
  • 理解的是正确的。


    其实如果每次来一个数据点,并不需要做排序操作,因为之前的数据是已经排好序的,只需要找到新的位置做插入就好,时间复杂度是 O(n) 的。


    这里的关键是,O(logn) 是远远低于 O(n) 的,而不是简单的开销小一点。这是我一直在课程中强调,并实验的内容。


    如果 n = 100 万,logn 只有 6,他们之间相差 10 万倍。这意味着如果 logn 的算法执行需要 1s 的话,O(n) 的算法要执行一天多。


    如果 n = 10 亿,logn 只有 9,他们之间相差 1 亿倍。这意味着如果 logn 的算法执行需要 1s 的话,O(n) 的算法需要执行 3 年多。


    继续加油!:)

    2024-06-21 08:23:09
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师