当前位置: 首页 > news >正文

福田网站建设龙岗网站建设罗湖网站建设福田网站建设用myeclipse做网站

福田网站建设龙岗网站建设罗湖网站建设福田网站建设,用myeclipse做网站,成都网站建设创意,西安关键词优化排名在一大堆数中求其前k大或前k小的问题#xff0c;简称TOP-K问题。而目前解决TOP-K问题最有效的算法即是BFPRT算法#xff0c;其又称为中位数的中位数算法#xff0c;该算法由Blum、Floyd、Pratt、Rivest、Tarjan提出#xff0c;最坏时间复杂度为O(n)O(n)。 读者要会快速排序…在一大堆数中求其前k大或前k小的问题简称TOP-K问题。而目前解决TOP-K问题最有效的算法即是BFPRT算法其又称为中位数的中位数算法该算法由Blum、Floyd、Pratt、Rivest、Tarjan提出最坏时间复杂度为O(n)O(n)。 读者要会快速排序相关知识如果不会请看这里 https://blog.csdn.net/hebtu666/article/details/81434236排序大家在里面找快速排序阅读即可。 我们以前写过快排的改进求前k大或前k小但是快排不可避免地存在退化问题即使我们用了随机数等优化最差情况不可避免的退化到了O(N^2而BFPRT就解决了这个问题主要的思想精华就是怎么选取划分值。 我们知道经典快排是选第一个数进行划分。而改进快排是随机选取一个数进行划分从概率上避免了基本有序情况的退化。而BFPRT算法选划分值的规则比较特殊保证了递归最小的缩减规模也会比较大而不是每次缩小一个数。 这个划分值如何划分就是重点。 如何让选取的点无论如何都不会太差。 1、将n个元素划分为n/5个组每组5个元素 2、对每组排序找到n/5个组中每一组的中位数  3、对于找到的所有中位数调用BFPRT算法求出它们的中位数作为划分值。 下面说明为什么这样找划分值。 我们先把数每五个分为一组。 同一列为一组。 排序之后第三行就是各组的中位数。 我们把第三行的数构成一个数列递归找找到中位数。 这个黑色框为什么找的很好。 因为他一定比A3、B3大而A3、B3、C3又在自己的组内比两个数要大。 我们看最差情况求算其它的数都比c3大我们也能在25个数中缩小九个数的规模。大约3/10. 我们就做到了最差情况固定递减规模而不是可能缩小的很少。 下面代码实现 public class BFPRT { //前k小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;} //第k小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;} //给定一个数组和范围求第i小的数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);}} //在begin end范围内进行操作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);//只不过i等于长度一半用来求中位数} //经典partition过程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(getMinKNumsByBFPRT(arr, 10));} }
http://wiki.neutronadmin.com/news/193004/

相关文章:

  • 四川纵川建设机械有限公司网站wordpress如何添加首页
  • 网站建设的小故事上海公司注销流程步骤
  • 网站开发培训怎么样陕西省安康市建行 网站
  • php 开源cms 企业网站电子商务网站建设实训内容
  • 怎样建设一个好的企业网站有赞微商城登陆
  • c#网站开发+pdf深圳市龙华区教育局官网
  • 郑州知名网站推广做网站需要买域名
  • 网站建设修改大型社区网站开发文档
  • 论坛类网站可以做移动端吗wordpress忘记admin
  • 安装网站包头网站制作公司
  • 个人网站设计与制作设计思路官网模版源码
  • 350做网站深圳照片网站cms
  • 网站搭建的流程及费用是多少?wordpress 开源插件
  • 中山企业营销型网站制作怎么访问wordpress
  • 网站备案免费的吗石景山重庆网站建设
  • 门户子网站建设申请创意广告宣传片制作
  • 广西南宁市住房和城乡建设局网站微网站医院策划案
  • 网站建设捌金手指花总八建设医院网站ppt
  • 网站开发培训北京中国建设招聘网站甘肃分行
  • 网站的音乐链接怎么做wordpress显示异常
  • 检察院前期网站建设携程网站建设的基本特点
  • 网站设计步骤大全百度总部地址
  • 链接提交百度站长平台布吉做棋牌网站建设哪家公司便宜
  • 建网站的每年有费用自己网站怎么做百度推广
  • 提供手机网站建设哪家好网络营销推广网站收录
  • 2018建设工程管理招团支部网站网页制作费用
  • wordpress怎么登录网站后台视频拍摄要求
  • 无锡网站制作难吗元旦海报设计图片手绘图
  • 网页加入信任站点英文搜索网站
  • 爱狼戈网站建设中国网站排名站长之家