您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】【面试题】找N个数据中最大的K个数据

2016-05-30 15:04 507 查看
如果不限定条件的话,这个问题还是很好解决的,但是当我们要求时间复杂度为O(N),空间复杂度为O(1)时,问题就没那么好解决了。

简单的思路就是,创建一个大小为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: