【数据结构】【面试题】找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个数据---堆排序

从N个数据中找出最大的K个数据,而且这里有一个限制:内存里存不下所有的N个数据,但是可以存下K个数据。这就让我们打消了用排序的方法来解的念头。   在这里我们使用堆排序来完成。  650) this....
  • leex_brave
  • leex_brave
  • 2016年05月24日 15:28
  • 2214

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

解题思路:一般思路就是将N个数排序后,取前k个数就ok。但是如果N个数是几十亿个数,加载不到内存怎么办?这就需要另外一种思路了,那就是利用堆。 具体的思路是:先建一个k个数的小堆,然后从k+1个数往...
  • bin_ge_love
  • bin_ge_love
  • 2016年06月22日 21:50
  • 1911

一道经典的面试题:如何从N个数中选出最大(小)的n个数?

一道经典的面试题:如何从N个数中选出最大(小)的n个数?北京交大LuoBin这个问题我前前后后考虑了有快一年了,也和不少人讨论过。据我得到的消息,Google和微软都面过这道题。这道题可能很多人都听说...
  • fisher_jiang
  • fisher_jiang
  • 2008年05月23日 15:34
  • 5836

N个数里面找出最大的k个数

转自出处
  • martin_liang
  • martin_liang
  • 2014年06月05日 09:04
  • 1521

找出N个元素的数组中最大的K个数

题目: 给出 N 个整数(N可能很大,以致无法装入内存),找出前 K 个最大的整数 【解法一】 如果 N 的数量不是很大,例如在几千个左右,则在这种情况下,那我们就先排序一下,这里快速排序或者推排序都...
  • shuiziliu1025
  • shuiziliu1025
  • 2016年03月22日 21:18
  • 972

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

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

选择问题——N个数中取第K个最大

一、简单排序             思路:将N个数从大到小排序,取第K个数          1.冒泡排序                void BubbleSort(int *arr...
  • spch2008
  • spch2008
  • 2012年12月11日 21:57
  • 3862

无序序列中O(n)时间复杂度寻找最小(最大)的K个数

一、快速排序,平均复杂度为n*logn 二、维护K个最小(最大)堆,平均复杂度为n*logK 三、类似快排的划分方法...
  • yueqian_zhu
  • yueqian_zhu
  • 2014年11月26日 19:33
  • 2151

【数据结构与算法】寻找最大的K个数

腾讯一面遇到这个题,发现这个题真的是比较经典,打算在这里好好总结一下。 参考自师姐的博文:http://blog.csdn.net/xiaxia__/article/details/44965455(...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年04月29日 09:25
  • 763

求无序数组之中最小的k个数

在无序数组中国找最小的k个数,一般有以下几种办法:   1.比较排序,然后找最小的k个数,时间复杂度下界为O(nlogn)   2.计数排序,时间复杂度可以做到O(n),但是要看具体的数据情况。也...
  • qq_26010491
  • qq_26010491
  • 2016年01月29日 15:56
  • 875
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数据结构】【面试题】找N个数据中最大的K个数据
举报原因:
原因补充:

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