求最小的K个数 O(N) 一种实现-基于堆排序
来源:互联网 发布:网络限速p2p下载 编辑:程序博客网 时间:2024/06/12 21:37
题目要求:给出一组数(有n个),求出前k个最小的数:
形式化描述如下:
给出一组数:c1,c2,...,Cn的无序排列A,设c1<c2<...<Cn,要求输出c1,c2,...,ck。
算法思想:用给定排列的前k个数建最大堆,对于后面的n-k个数,逐个进行判断,Ai(K<i<=n)
如果Ai<堆中最大数,则删除堆中最大数,插入Ai。这样到最后,序列A中的前k个最小数,就是堆中的k个数了
说白了,就是开始时认为序列中的前k个数就是这k个最小数,然后通过判断剩余的数,看看是否比这k个数中最大的
还小,若小则将其换出,这样到最后,被换出的数肯定比这k个数都大,所以,这k个数就是前k个最小数了;
建堆的复杂度为klogk+logk(n-k),因为k是常数,所以为O(N)
算法实现如下:
附上全部代码如下:
共两个文件,一个是最大堆得实现(MaxHeap.h),一个是算法实现与运行演示(theKthMins.cc):
注意:(将这两个文件放在同一目录下)
编译命令:g++ -o theKthMins theKthMins.cc MaxHeap.h
文件 MaxHeap.h 如下:
文件theKthMins.cc 如下:
运行结果如下:
[jim@gpu1 heap]$ g++ -o theKthMins theKthMins.cc MaxHeap.h
[jim@gpu1 heap]$ ./theKthMins
5 4 3 2 1
[jim@gpu1 heap]$
[jim@gpu1 heap]$ ./theKthMins
5 4 3 2 1
[jim@gpu1 heap]$
- 求最小的K个数 O(N) 一种实现-基于堆排序
- O(n)时间复杂度求最小的k个数和第k小的数
- 堆排序(最小的K个数)
- 【java】堆排序 最小的k个数
- 求N个数中最小的K的数 O(NlogK)
- 寻找最小的k个数 时间复杂度 O(n*k)
- 堆问题:求n个整数中最小的K个数
- 求n个数中最小的K个数。
- 用堆排序的思想求最小的k个数,处理海量数据
- 最小的k个数——O(n )解法
- 利用堆求最大或最小的前k个数
- O(n)时间求最接近中位数的k个数
- O(n)时间求最接近中位数的k个数
- java最小堆实现优先权队列和求最大的n个数问题
- 求输入n个整数中最小的k个数
- 输入n个数,输出最小的k个数,java实现
- 寻找最小的k个数(采用维护n个元素的最小堆的方法来实现)
- 九度OJ 1371 最小的K个数 -- 堆排序
- dos实现文件夹树目录生成
- qt字库的移植(使其很好的显示中文)
- mysql 语句
- substr(),mb_substr()及mb_strcut的区别和用法
- Flex垃圾回收机制
- 求最小的K个数 O(N) 一种实现-基于堆排序
- ResumeThread
- 使用hibernate二级缓存优化你的应用
- 利用Javascript取和设FCKeditor值
- Python3.2 --- 异常处理
- PHP : echo和print的区别
- instances) and similar IP handles (that may additionally report that one particular person is filling out the prospect kind vari
- instances) and similar IP handles (that may additionally report that one particular person is filling out the prospect kind vari
- php $_SERVER 属性说明