TopN问题

100亿个integer数据,如何找到前k个最小值。

也就是问的如何排序最快

堆排序最快

完全二叉树

堆结构其实就是一颗完全二叉树

大根堆和小根堆

大根堆:每一个根节点都大于它的叶子结点

小根堆:每一个根节点都小于它的叶子结点

通过建立大根堆或者小根堆来实现topN的问题。

自顶向下建堆并且排序

也就是说从二叉树的根开始创建小根堆或大根堆,每次加入节点的时候都需要判断当前节点与根节点大小。就是一个频繁比较与交换的过程

最终根节点就是最大或者最小的元素,取出二叉树根节点之后,然后将新节点放在跟根节点重新构建堆,再取二叉树的根节点。

最后剩一个节点结束。这样就完成了堆的排序。

结论

  • 1 首先取出前1w条数据建立最小堆(要考虑内存问题,不能将100亿条数据都读入内存)
  • 2 每次取出二叉树根节点存入文件当中
  • 3 重新构建堆,重复过程2
  • 4 直至100亿条数据都加入了二叉树中,此时只剩二叉树的节点。
  • 5 然后每次将二叉树的最后一个元素放入二叉树的根节点上,重复 2 3操作,直至剩余最后一个元素为止。
  • 6 我们的排序就结束了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值