为了账号安全,请及时绑定邮箱和手机立即绑定

有一个算法问题想请教,给定一亿个数,如何用最快的方法取出其中最大的三个数。

有一个算法问题想请教,给定一亿个数,如何用最快的方法取出其中最大的三个数。

BIG阳 2019-03-13 18:15:40
最近有一个java大神,是蚂蚁支付宝的哦,问了我这么一个问题。我的回答是先将数组分解成两百个小数组或者更多,在开两百个thread进行排序,取最大,然后对这两百个数进行排序,取前三。其实我的思路根本就没有涉及到算法层面,也只是暴力破解。其实这不是最好的做法,因为这样会严重的浪费资源,然后他的回答是堆排序。我的问题是堆排序是怎样实现的,最好用代码体现出来。
查看完整描述

8 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k算法问题)。由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。可以利用数据结构的最小堆来处理该问题。

https://img1.sycdn.imooc.com//5cb972f20001d83305170266.jpg

最小堆,对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然根节点是其中的最小数值)。每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。

由于仅仅保存了K个数据,有调整最小堆的时间复杂度为O(logK),因此TOp K算法(问题)时间复杂度为O(nlogK).


查看完整回答
1 反对 回复 2019-04-19
?
慕后森

TA贡献1802条经验 获得超5个赞

这不是典型的Top k问题吗,你可以百度一下Top K


查看完整回答
反对 回复 2019-04-19
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

topn的如果说稳妥的答案堆排是没有错的 问题是这个3取的。。。这么小的数


查看完整回答
反对 回复 2019-04-19
?
互换的青春

TA贡献1797条经验 获得超6个赞

就是堆排序a


查看完整回答
反对 回复 2019-04-19
?
慕神8447489

TA贡献1780条经验 获得超1个赞

查看完整回答
反对 回复 2019-04-19
?
哔哔one

TA贡献1854条经验 获得超8个赞

你要的堆排,JAVA




public class 堆排 {


    public static void main(String[] args) {

        int [] arr= {0,5,3,2,6,7};

        HeapSort(arr);

        for(int s:arr){

            System.out.println(s);

        }

    }

    public static void BuildHeap(int[] arr,int s,int length){

        int temp = arr[s];

        for(int j = s*2 +1 ; j<length;j = j*2 +1){

            if(j+1<length && arr[j]>arr[j+1]){

                j++;

            }

            if(temp < arr[j]){

                break;

            }

            arr[s] = arr[j];

            s = j;

        }

        arr[s] = temp;

    }

    public static void HeapSort(int[] arr){

        for(int i = (arr.length)/2-1;i>=0;i--){

            BuildHeap(arr, i, arr.length);

        }

        for(int i = arr.length - 1;i>=0;i--){

            if(arr[0]!= arr[i]){

                arr[i] ^= arr[0];

                arr[0] ^= arr[i];

                arr[i] ^= arr[0];

            }

            BuildHeap(arr, 0, i);

        }

    }

}


查看完整回答
反对 回复 2019-04-19
  • 8 回答
  • 0 关注
  • 721 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号