前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从10亿个数据找出最大的N个

从10亿个数据找出最大的N个

原创
作者头像
剁椒鱼鳞
修改2023-05-26 18:11:36
2650
修改2023-05-26 18:11:36
举报
文章被收录于专栏:前端小学生前端小学生

分析:

  1. 首先需要分区,每区分为10万,假设分为a个区
  2. 在每个区里,求出最大的N个,由此得出a个长度为N的数组
  3. 将上述a个长度为N的数组合并为一个数组b
  4. 在b中求出最大的N个
  5. 主要注意的是,如果合并后的数组仍旧很大,则再进行1-3步骤,否则则直接进行步骤4。

上代码:

代码语言:javascript
复制
let arr = [];
for (let i = 0; i < 100000000; i++) {
    arr.push(Math.ceil(Math.random() * 10000000));
}

function findMax(arr, num) {
    if (arr.length <= num) {
        return arr.sort((a, b) => {
            if (a > b) {
                return 1;
            } else {
                return -1;
            }
        });
    }
    let tempMaxArr = arr.splice(0, num);
    const sortArr = function() {
        tempMaxArr = tempMaxArr.sort((a, b) => {
            if (a > b) {
                return 1;
            } else {
                return -1;
            }
        })
    }
    sortArr();
    for (let i = 0; i < arr.length; i++){
        if (arr[i] > tempMaxArr[0]) {
            // tempMaxArr.shift();
            // tempMaxArr.unshift(arr[i]);
            tempMaxArr[0] = arr[i];
            sortArr();
        }
    }
    return tempMaxArr;
}

function findBiggest(arr, num) {
    if (Object.prototype.toString.call(arr) !== '[object Array]') {
        throw new Error('请传入数字');
    }
    const diff = 100000;
    const len = Math.ceil(arr.length / diff);
    let tempTotalBigArr = [];
    for (let i = 0; i < len; i++) {
        const tempArr = arr.slice(i * diff, (i + 1) * diff);
        const tempBigArr = findMax(tempArr, num);
        tempTotalBigArr = tempTotalBigArr.concat(tempBigArr);
    }
    if (tempTotalBigArr.length > diff)  {
        findBiggest(tempTotalBigArr, num);
    } else {
        const bigArr = findMax(tempTotalBigArr, num);
        console.log(`最大的${ num }个数字:`, bigArr);
    }
}

findBiggest(arr, 100);

至于findMax方法,在另外一篇文章【从10万个数中找10个最大的数】已讲述,这里不再进行额外讲述。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档