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

原创 2016年05月30日 15:04:36

    如果不限定条件的话,这个问题还是很好解决的,但是当我们要求时间复杂度为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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【数据结构】找出N个数据中最大的前k个数据(利用堆排序)

我们举例,假若从10000万个数里选出前100个最大的数据。首先我们先分析:既然要选出前100个最大的数据,我们就建立一个大小为100的堆(建堆时就按找最大堆的规则建立,即每一个根节点都大于它的子女节...

【数据结构】找出N个数据中最大的前k个数据(利用堆排序)

我们举例,假若从10000万个数里选出前100个最大的数据。首先我们先分析:既然要选出前100个最大的数据,我们就建立一个大小为100的堆(建堆时就按找最大堆的规则建立,即每一个根节点都大于它的子女节...

数据结构面试题总结1——数组:求最大、次大值

一般大家一开始想到的办法就是一次循环,记录下最大值和最小值。或者就是用两次冒泡,找到最大值和次大值。 这两种方法实践复杂度差不多都是O(2n),如果数组很长,效率还是不够高的。 注意:直接排序...
  • B_Allen
  • B_Allen
  • 2015年05月28日 21:03
  • 840

数据结构面试题1.2.4-求子数组的最大和

package questions; /** * @title 求子数组的最大和 * @question 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子...

算法与数据结构面试题(3)-求子数组的最大和

题目 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2,...

数据结构面试题总结7——数组:最大连续子段和、最大连续子段积

问题描述:给定一个数组(元素可负,输出数组的任何连续子数组中的最大值。 此题有很多种解法。 第一种:循环嵌套,找出所有组合,记录最大值。时间复杂度O(n^2)。 int MaxSum(int *v,i...
  • B_Allen
  • B_Allen
  • 2015年05月30日 15:37
  • 641

程序员面试题精选100题(09)-链表中倒数第k个结点[数据结构]

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:   struct ListNode { int m_nKey; ListN...

数据结构面试题/求二叉树叶子节点的个数/求二叉树第k层的节点个数

题目:求二叉树叶子节点的个数/求二叉树第k层的节点个数 二叉树如图所示: #pragma once #include #include #include #include using namesp...

数据结构面试题1.2.9-查找最小的K个元素-使用最大堆

package questions; import java.util.Arrays; import java.util.Random; /** * @title 查找最小的K个元素-使用最大堆...

面试题: 求N个数中前k个大的数(大数据)

解题思路:一般思路就是将N个数排序后,取前k个数就ok。但是如果N个数是几十亿个数,加载不到内存怎么办?这就需要另外一种思路了,那就是利用堆。 具体的思路是:先建一个k个数的小堆,然后从k+1个数往...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数据结构】【面试题】找N个数据中最大的K个数据
举报原因:
原因补充:

(最多只允许输入30个字)