100亿个integer数据,如何找到前k个最小值。
也就是问的如何排序最快
堆排序最快
完全二叉树
堆结构其实就是一颗完全二叉树
大根堆和小根堆
大根堆:每一个根节点都大于它的叶子结点
小根堆:每一个根节点都小于它的叶子结点
通过建立大根堆或者小根堆来实现topN的问题。
自顶向下建堆并且排序
也就是说从二叉树的根开始创建小根堆或大根堆,每次加入节点的时候都需要判断当前节点与根节点大小。就是一个频繁比较与交换的过程。
最终根节点就是最大或者最小的元素,取出二叉树根节点之后,然后将新节点放在跟根节点重新构建堆,再取二叉树的根节点。
最后剩一个节点结束。这样就完成了堆的排序。
结论
- 1 首先取出前1w条数据建立最小堆(要考虑内存问题,不能将100亿条数据都读入内存)
- 2 每次取出二叉树根节点存入文件当中
- 3 重新构建堆,重复过程2
- 4 直至100亿条数据都加入了二叉树中,此时只剩二叉树的节点。
- 5 然后每次将二叉树的最后一个元素放入二叉树的根节点上,重复 2 3操作,直至剩余最后一个元素为止。
- 6 我们的排序就结束了