【数据结构】【面试题】找N个数据中最大的K个数据
2016-05-30 15:04
507 查看
如果不限定条件的话,这个问题还是很好解决的,但是当我们要求时间复杂度为O(N),空间复杂度为O(1)时,问题就没那么好解决了。
简单的思路就是,创建一个大小为K=100的小堆,调整好,然后从K开始拿十万个数据一个一个跟堆头比较,如果比堆头大,就入堆,然后调整成最小堆,一直循环到第N=100000个数据。
本文出自 “滴水” 博客,请务必保留此出处http://10740329.blog.51cto.com/10730329/1768177
简单的思路就是,创建一个大小为K=100的小堆,调整好,然后从K开始拿十万个数据一个一个跟堆头比较,如果比堆头大,就入堆,然后调整成最小堆,一直循环到第N=100000个数据。
void AdjustDown(int* _a, size_t size,int i) { int parent = i; int child = 2 * parent + 1; while (child < size) { //找出孩子中的最小值 if (child + 1 < size && _a[child + 1] < _a[child]) { ++child; } //与父节点做比较 if (_a[parent] > _a[child]) { swap(_a[parent], _a[child]); parent = child; child = parent * 2 + 1; } else { break; } } } //找N个数据中的最大K个 int* GetKTop(int* a,size_t size,size_t n) { int* _a = new int[size]; for (int i = 0; i < size; i++) { _a[i] = a[i]; } //建堆 for (int i = (size - 2) / 2; i >= 0; i--) { AdjustDown(_a, size,i); } for (int i = 0; i < n - size; i++) { if (_a[0] < a[size + i]) { _a[0] = a[size + i]; AdjustDown(_a, size, 0); } } return _a; } void _AdjustDown(int* a, size_t size, int i) { int parent = i; int child = 2 * parent + 1; while (child < size) { //找出孩子中的最大值 if (child + 1 < size && a[child] < a[child + 1]) { ++child; } //拿父节点与最大子节点做比较 if (a[parent] < a[child]) { swap(a[parent], a[child]); parent = child; child = 2 * parent + 1; } else { break; } } }
本文出自 “滴水” 博客,请务必保留此出处http://10740329.blog.51cto.com/10730329/1768177
相关文章推荐
- 【数据结构】位图BitMap与布隆过滤器BloomFilter
- ACM 数据结构-二叉树 HDU 3791二叉搜索树
- ACM 数据结构-并查集 HDU 1272 小希的迷宫
- ACM 数据结构-并查集 HDU 1232 畅通工程
- ACM 数据结构-并查集 HDU 1213 How Many Tables
- 静态链表C语言数据结构
- POJ3469
- 数据结构上机测试2-1:单链表操作A
- Python中的Berkeley DB(2):数据结构
- 数据结构—抽象数据类型
- 数据结构——链表
- 数据结构排序
- 矩阵的压缩存储
- 矩阵的压缩存储
- 位图BitMap
- 数据结构笔记整理第6章:图
- java数据结构之单链表
- 位运算-Single Number III(只有两个不同的数字出现了一次,其余出现了两次,找出这两个数)
- 06-图1 列出连通集 (25分)
- 数据结构与算法_杂记_1