精华在评论区。。。。

当时去面试的时候现场现写,憋了将近一个小时,用递归实现了,估计问题很多,不是人家怎么可能不要我,哈哈哈,开个玩笑;

思路就是新建一个长度为100数组array1,把前100个元素放进去,排个序,然后再把剩下的元素拿来跟array1里面的元素比较,大于的时候替换,等于的时候就跳出循环取下一个元素,遍历一遍大数组就能取出前100大的数来,没考虑到时间复杂度,心里想实现了就烧高香了,那还管得了那么多。

后来回来百度的时候才发现,有更简洁的办法 ,利用堆排实现

什么是堆排?具体请见下面大神的博客

传送门:数据结构——常见的十种排序算法

利用堆排实现
1.取前n个数,建立一个小根堆。建堆的时间复杂度为O(nlogn)
2.顺序读取后边的元素,如果该元素比堆顶的元素小,直接丢弃。如果大于堆顶的元素则替换它,然后调整堆,最坏的情况是每一次都需要调整堆。时间复杂度为O(mlogn)。m为数据总数,n表示前n大的数。

代码实现:

import java.util.Arrays;/*** @auther: shy* @date: 2020/5/13 9:50*/
public class TopN {/*** 找出数组arr中最大的前n个值,不要求这n个值有序*/public static int[] topN(int[] arr, int n) {/*** 构建堆积*/int[] list = new int[n];// 在堆顶的始终是最小的值for (int i = 0; i < n; i++) {int t = i;while (t != 0 && list[parent(t)] > list[t]) {swap(list, t, t = parent(t));}}/*** 小顶堆*/for (int i = n, len = arr.length; i < len; i++) {if (arr[i] >= list[0]) {// 置换栈顶list[0] = arr[i];// 调整栈顶int t = 0;// left(t) < n 防止下标越界while ((left(t) < n && list[t] > list[left(t)]) || (right(t) < n && list[t] > list[right(t)])) {// 比较右节点和左节点值值,把小的节点值和父节点值对调if (right(t) < n && list[right(t)] < list[left(t)]) {swap(list, t, t = right(t));} else {swap(list, t, t = left(t));}}}}return list;}private static void swap(int[] list, int i, int j) {int tmp = list[i];list[i] = list[j];list[j] = tmp;}/*** 父节点索引*/private static int parent(int i) {return (i - 1) / 2;}/*** 左孩子索引*/private static int left(int i) {return 2 * i + 1;}/*** 右孩子索引*/private static int right(int i) {return 2 * i + 2;}public static void main(String[] args) {int[] arr = new int[] { 1, 2,90,47, 23, 4, 5, 11,97,1009, 12, 13,66 ,100 ,87};System.out.println(Arrays.toString(TopN.topN(arr, 4)));}
}

代码并非本人所写,来自大佬的博客,大佬写的很好帖出来一起学习,地址不小心走丢。。。。。。。。。。。。。。

10亿数据找出前100大的数据(网易大数据面试算法题)相关推荐

  1. 10亿数据找出前100大的数据

    方法1:利用堆排实现 取前m个数,建立一个小根堆.建堆的时间复杂度为O(mlogm) 顺序读取后边的元素,如果该元素比堆顶的元素小,直接丢弃.如果大于堆顶的元素则替换它,然后调整堆,最坏的情况是每一次 ...

  2. 从1亿个数里面找出前100个最大的

    从1亿个数里面找出前100个最大的 这个题目应该是一些大公司面试题中经常被问到的,这里我给出一种做法,至于面试官满不满意我就不知道了.我们知道,这种找出前多少个最大或者最小的最适合用堆排序(对堆排序不 ...

  3. 100亿数据找出最大的1000个数字的4种方法

    100亿数据找出最大的1000个数字 面试题:解决的四种方法: 方法一:全排序法 1.最容易想到的方法是将数据全部排序.该方法并不高效,因为题目的目的是寻找出最大的10000个数即可,而排序却是将所有 ...

  4. 【面试现场】如何在10亿数中找出前1000大的数

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 之前小史在BAT三家的面试中已经挂了两家,今天小史去了BAT中的最后一家面试了. 简单的 ...

  5. 如何在 10 亿数中找出前 1000 大的数?

    作者 | channingbreeze 责编 | 胡巍巍 小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 之前小史在BAT三家的面试中已 ...

  6. 如何在10亿个整数中找出前1000个最大的数?

    作者:vincent-duan,专注 Java,沉迷开源,架构师社区合伙人! 面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一 ...

  7. 如何在10亿个整数中找出前1000个最大的数(TopN算法)

    面试题目:如何在10亿个整数中找出前1000个最大的数. 我们知道排序算法有很多: 冒泡算法:通过两层for循环,外层第一次循环找到数组中最大的元素放置在倒数第一个位置,第二次循环找到第二大的元素放置 ...

  8. 在10亿个数中找出前1000个最大的

    在10亿个数中找出前1000个最大的 假设现在有一个文件,里面存放了10亿个整数,需要找出前1000个最大的. 方法: 1.普通排序,部分排序:几乎不可取. 2.分治法:随机选一个数t,然后对整个数组 ...

  9. 谈从10亿个数中找出前10万个最大的

    谈从10亿个数中找出前10万个最大的 期的实验显示10亿个浮点数大概占据3G左右的空间,因此全部一次性读入内存目前在个人PC上是不太现实的.本次讨论不考虑内存等等,只考虑算法. 如果一次性比较排序,然 ...

最新文章

  1. 权威解答495个最常遇到的C语言问题
  2. 记一次php项目上线遇到的坑
  3. vmare安装ghostwin7
  4. [bbk5307]第76集 第9章 -数据库性能维护 03
  5. LeetCode 832. 翻转图像(异或^)
  6. Java笔记-DH密钥交换
  7. selenium学习过程中遇到的问题
  8. Go 远超 Python,机器学习人才极度稀缺,全球 16,655 位程序员告诉你这些真相!...
  9. android实现控件的手势缩放、移动以及双击还原
  10. linux docker运行exe,如何在docker中运行windows
  11. 网赚在线之Cashfiesta公司网上赚钱全攻略
  12. VIM复制粘贴 的快捷键是什么
  13. 2015年数模B题学习报告
  14. effective C++ 读书笔记
  15. 华为AP 6050DN配置成家庭路由器
  16. 1.13正版服务器,我的世界Minecraft梦幻世界服务器(1.7-1.13版本)
  17. Appium 自动化测试 H5页面元素定位
  18. OpenCV之图像像素归一化
  19. STM32—ADC和DMA的应用之电流检测(第二部分:电流检测电路与数据处理)
  20. VBA提高篇_12_1 VBA判断奇偶数的方法

热门文章

  1. php金花游戏,PHP实现炸金花游戏比赛
  2. 基于扫描的磁盘调度算法
  3. 2019 前端年终总结(干货满满)
  4. 【AIX】AIX内存机制
  5. screentogif能录制声音吗_如何用Screen to Gif快速录制动图
  6. docker 部署 kong konga postgresql 以及konga配置
  7. centos7 安装Kong和Konga
  8. AnimationEvent事件问题之详细分解
  9. 如何上传自己的项目到Maven中央仓库
  10. 如何让word左边显示目录