package basic_class_02;/*** * 在一大堆数中求其前k大或前k小的问题,简称TOP-K问题。* 而目前解决TOP-K问题最有效的算法即是BFPRT算法**/
public class Code_06_BFPRT {// O(N*logK)public static int[] getMinKNumsByHeap(int[] arr, int k) {if (k < 1 || k > arr.length) {return arr;}int[] kHeap = new int[k];for (int i = 0; i != k; i++) {heapInsert(kHeap, arr[i], i);}for (int i = k; i != arr.length; i++) {if (arr[i] < kHeap[0]) {kHeap[0] = arr[i];heapify(kHeap, 0, k);}}return kHeap;}public static void heapInsert(int[] arr, int value, int index) {arr[index] = value;while (index != 0) {int parent = (index - 1) / 2;if (arr[parent] < arr[index]) {swap(arr, parent, index);index = parent;} else {break;}}}public static void heapify(int[] arr, int index, int heapSize) {int left = index * 2 + 1;int right = index * 2 + 2;int largest = index;while (left < heapSize) {if (arr[left] > arr[index]) {largest = left;}if (right < heapSize && arr[right] > arr[largest]) {largest = right;}if (largest != index) {swap(arr, largest, index);} else {break;}index = largest;left = index * 2 + 1;right = index * 2 + 2;}}// O(N)public static int[] getMinKNumsByBFPRT(int[] arr, int k) {if (k < 1 || k > arr.length) {return arr;}int minKth = getMinKthByBFPRT(arr, k);int[] res = new int[k];int index = 0;for (int i = 0; i != arr.length; i++) {if (arr[i] < minKth) {res[index++] = arr[i];}}for (; index != res.length; index++) {res[index] = minKth;}return res;}public static int getMinKthByBFPRT(int[] arr, int K) {int[] copyArr = copyArray(arr);return select(copyArr, 0, copyArr.length - 1, K - 1);}public static int[] copyArray(int[] arr) {int[] res = new int[arr.length];for (int i = 0; i != res.length; i++) {res[i] = arr[i];}return res;}public static int select(int[] arr, int begin, int end, int i) {if (begin == end) {return arr[begin];}int pivot = medianOfMedians(arr, begin, end);int[] pivotRange = partition(arr, begin, end, pivot);if (i >= pivotRange[0] && i <= pivotRange[1]) {return arr[i];} else if (i < pivotRange[0]) {return select(arr, begin, pivotRange[0] - 1, i);} else {return select(arr, pivotRange[1] + 1, end, i);}}public static int medianOfMedians(int[] arr, int begin, int end) {int num = end - begin + 1;int offset = num % 5 == 0 ? 0 : 1;int[] mArr = new int[num / 5 + offset];for (int i = 0; i < mArr.length; i++) {int beginI = begin + i * 5;int endI = beginI + 4;mArr[i] = getMedian(arr, beginI, Math.min(end, endI));}return select(mArr, 0, mArr.length - 1, mArr.length / 2);}public static int[] partition(int[] arr, int begin, int end, int pivotValue) {int small = begin - 1;int cur = begin;int big = end + 1;while (cur != big) {if (arr[cur] < pivotValue) {swap(arr, ++small, cur++);} else if (arr[cur] > pivotValue) {swap(arr, cur, --big);} else {cur++;}}int[] range = new int[2];range[0] = small + 1;range[1] = big - 1;return range;}public static int getMedian(int[] arr, int begin, int end) {insertionSort(arr, begin, end);int sum = end + begin;int mid = (sum / 2) + (sum % 2);return arr[mid];}public static void insertionSort(int[] arr, int begin, int end) {for (int i = begin + 1; i != end + 1; i++) {for (int j = i; j != begin; j--) {if (arr[j - 1] > arr[j]) {swap(arr, j - 1, j);} else {break;}}}}public static void swap(int[] arr, int index1, int index2) {int tmp = arr[index1];arr[index1] = arr[index2];arr[index2] = tmp;}public static void printArray(int[] arr) {for (int i = 0; i != arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}public static void main(String[] args) {int[] arr = { 6, 9, 1, 3, 1, 2, 2, 5, 6, 1, 3, 5, 9, 7, 2, 5, 6, 1, 9 };// sorted : { 1, 1, 1, 1, 2, 2, 2, 3, 3, 5, 5, 5, 6, 6, 6, 7, 9, 9, 9 }printArray(getMinKNumsByHeap(arr, 10));printArray(getMinKNumsByBFPRT(arr, 10));}}

0206.BFPRT在一大堆数中求其前k大或前k小的问题,简称TOP-K问题(左神算法基础班源码)相关推荐

  1. 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)

    package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...

  2. 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点

    Problem: 在二叉树中找到一个节点的后继节点 [题目] 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node l ...

  3. 左神算法进阶班5_3求公司的最大活跃度

    [题目] 一个公司的上下节关系是一棵多叉树,这个公司要举办晚会,你作为组织者已经摸清了大家的心理: 一个员工的直接上级如果到场,这个员工肯定不会来. 每个员工都有一个活跃度的值,决定谁来你会给这个员工 ...

  4. 深度强化学习中Double DQN算法(Q-Learning+CNN)的讲解及在Asterix游戏上的实战(超详细 附源码)

    需要源码和环境搭建请点赞关注收藏后评论区留下QQ~~~ 一.核心思想 针对DQN中出现的高估问题,有人提出深度双Q网络算法(DDQN),该算法是将强化学习中的双Q学习应用于DQN中.在强化学习中,双Q ...

  5. word文档中插入的图片太大如何压缩变小的问题

    如果对word文档中图片的分辨率有特别的要求的话,直接点击图片,在出现的编辑菜单中用"压缩"命令就可以了,见下图. 转载于:https://www.cnblogs.com/ljy3 ...

  6. Mysql中求两个时间差的小时数以及mysql中substring_index 用法

    Mysql中求两个时间差的小时数以及mysql中substring_index 用法 1.mysql中求两个时间的差,返回小时数:可以使用mysql的hour() 函数,具体如下: SQL code ...

  7. 求数据流中的第K大元素

    题目 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数 ...

  8. 海量数据处理 - 10亿个数中找出最大的10000个数(top K)

    海量数据处理 - 10亿个数中找出最大的10000个数(top K问题) 版权声明:本文为博主原创文章,未经博主允许不得转载 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望 ...

  9. 海量数据处理:如何从10亿个数中,找出最大的10000个数?(top K问题)

    一.问题 有 10 亿个不重复的数字,内存中只能放进 1 万个数,怎么找到最大的 10 万个数字? 这道题的思路是,先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的) ...

最新文章

  1. 各种光学仪器成像技术(上)
  2. oracle高资源消耗sql,oracle 中如何定位重要(消耗资源多)的SQL
  3. iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
  4. 【锁相环系列3】QPSK解调之Costas锁相环去小频偏(重点环路滤波器参数设置和迭代核心代码详解)
  5. linux网络编程客户端,Linux网络编程入门
  6. html工具箱源码,大灰狼的ASP工具箱——XMLHTTP的应用,获得远程的文件,获得远程HTML文件源码...
  7. webstorm怎样查找历史记录
  8. 【大数据部落】r语言多均线股票价格量化策略回测
  9. php 改变图片大小,如何把照片尺寸改小 电子照片尺寸怎么改
  10. js 京东关闭广告 pink
  11. /* 商人过河的问题 假如有三个商人各带一个随从要过河。 只有一条船得需要他们划每次只能坐两个人,条件是任何一岸的随从多于商人时随从就会抢劫商人。 请问这三个商人怎样才能安全过河? */...
  12. 使用计算机的安全事项,电脑安全使用注意事项
  13. sketch android设计,安卓手机预览sketch设计稿的偏方
  14. Documentum常见问题4—如何通过vlink方式直接查看文档内容【转】
  15. java 图片宽高_[Java]获取图片高和宽
  16. Vue使用Eslint报“Parsing error: x-invalid-end-tag“错误的解决方案
  17. eggjs 怎么使用 egg-jwt 实现 token 解析?
  18. JOMESA Filter Mounts1 PU滤膜载物片
  19. 刷题第八天(贪心加前缀和,待更新)
  20. TCP/UDP协议抓包-工具wireshark与tcp侦听工具

热门文章

  1. bootstraptable treegrid
  2. CAD图层的顺序的调整
  3. 操作系统 第九章 死锁
  4. 橙仕汽车——双排mini卡
  5. Android滑动浮层(滑动布局中使其中子布局一个浮动)
  6. 01.什么是数学建模
  7. jQuery诞生记-原理与机制
  8. 爬虫类Chrome去除前端无限debugger反调试(轻松分析算法)
  9. scrapy多个url爬虫
  10. 蓝牙低功耗音频技术--目录大纲