目录

1 问题描述 

2 解决方案

2.1 计算中值问题

2.2 选择问题

 


1 问题描述

中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中间的值被称为中值。

选择问题是求一个n个数列表的第k个最小元素的问题。


2 解决方案

2.1 计算中值问题

本文使用Lomuto划分算法思想,此处引用《算法设计与分析基础》第三版上一段文字介绍及配图,具体如下:

具体实现代码如下:

  1. package com.liuzhen.chapter4;
  2.  
  3. public class MedianProblem {
  4. //Lomuto划分
  5. /*
  6. * 参数A:给定的随机数数组
  7. * 参数start:开始进行选择的数组元素位置
  8. * 参数end:最后一个进行选择的数组元素位置
  9. * 函数功能:返回A[start]到A[end]元素中间的某一元素位置result,使得 左边部分元素 < A[result] <=右边部分元素
  10. */
  11. public int LomutoPartition(int[] A,int start,int end){
  12. int begin = A[start];
  13. int result = start;
  14. for(int i = start+1;i <= end;i++){
  15. if(A[i] < begin){
  16. /*
  17. * 一旦出现小于begin的元素,result向后移动一位;
  18. * 出现大于的不移动,当再次出现小于begin的元素,result向后移动一位,
  19. * 此时result恰好指向第一个大于begin的元素,此时执行swap(A,result,i)
  20. */
  21. result = result + 1;
  22. swap(A,result,i);
  23. }
  24. }
  25. swap(A,start,result);
  26. return result;
  27. }
  28. //交换数组中位置为m和n上的元素值
  29. public void swap(int[] A,int m,int n){
  30. int temp = A[m];
  31. A[m] = A[n];
  32. A[n] = temp;
  33. }
  34.  
  35. public static void main(String[] args){
  36. MedianProblem test = new MedianProblem();
  37. int[] A = {4,1,10,8,7,12,9,2,15};
  38. int result = test.LomutoPartition(A, 0, A.length-1);
  39. System.out.println("对数组进栈Lomuto划分后结果:");
  40. for(int i = 0;i < A.length;i++)
  41. System.out.print(A[i]+" ");
  42. System.out.println("\n"+"进行Lomuto划分后的数组中轴位置:"+result);
  43. }
  44. }

运行结果:

  1. 对数组进栈Lomuto划分后结果:
  2. 2 1 4 8 7 12 9 10 15
  3. 进行Lomuto划分后的数组中轴位置:2

2.2 选择问题

通过2.1 计算中值问题中Lomuto算法的运用,那么如何寻找n个元素中第k个最小元素呢?此处调用2.1中相关函数,具体实现代码如下:

  1. package com.liuzhen.chapter4;
  2.  
  3. public class SelectProblem {
  4. //快速选择
  5. /*
  6. * 参数A:给定随机数数组
  7. * 参数k:要求输出的第k个最小元素
  8. * 函数功能:返回数组A的第k个最小元素的值
  9. */
  10. public int quickSelect(int[] A,int k){
  11. int start = 0;
  12. int end = A.length-1;
  13. int mid = new MedianProblem().LomutoPartition(A, start,end);
  14. while(true){
  15. if(mid > k-1){
  16. end = mid-1;
  17. mid = new MedianProblem().LomutoPartition(A, start,end);
  18. }
  19. else if(mid < k-1){
  20. start = mid+1;
  21. mid = new MedianProblem().LomutoPartition(A, start,end);
  22. }
  23. else
  24. break;
  25. }
  26. return A[mid];
  27. }
  28.  
  29. public static void main(String[] args){
  30. SelectProblem test = new SelectProblem();
  31. int[] A = {4,1,10,8,7,12,9,2,15};
  32. int result = test.quickSelect(A, 5);
  33. System.out.println("对数组进行快速选择并执行划分后结果:");
  34. for(int i = 0;i < A.length;i++)
  35. System.out.print(A[i]+" ");
  36. System.out.println("\n"+"进行快速选择后得到数组第5最小元素(从小到大排序):"+result);
  37. }
  38. }

运行结果:

  1. 对数组进行快速选择并执行划分后结果:
  2. 2 1 4 7 8 12 9 10 15
  3. 进行快速选择后得到数组第5最小元素(从小到大排序):8

算法笔记_031:计算中值和选择问题(Java)的更多相关文章

  1. 算法笔记_076:蓝桥杯练习 结点选择(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多 ...

  2. 算法笔记_075:蓝桥杯练习 最短路(Java)

    目录 1 问题描述 2 解决方案 2.1 floyd算法解决 2.2 spfa算法解决   1 问题描述 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从 ...

  3. 算法笔记_083:蓝桥杯练习 合并石子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...

  4. 算法笔记_231:网格中移动字母(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着.如图[1.jpg]所示. 和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和 ...

  5. 算法笔记_222:串中取3个不重复字母(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 从标准输入读入一个由字母构成的串(不大于30个字符). 从该串中取出3个不重复的字符,求所有的取法. 取出的字符,要求按字母升序排列成一个串. 不同 ...

  6. 算法笔记_035:寻找最小的k个数(Java)

    目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...

  7. 算法笔记_184:历届试题 约数倍数选卡片(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 闲暇时,福尔摩斯和华生玩一个游戏: 在N张卡片上写有N个整数.两人轮流拿走一张卡片.要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数 ...

  8. 算法笔记_065:分治法求逆序对(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序)   1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...

  9. 算法笔记_017:递归执行顺序的探讨(Java)

    目录 1 问题描述 2 解决方案 2.1 问题化简 2.2 定位输出测试 2.3 回顾总结 1 问题描述 最近两天在思考如何使用蛮力法解决旅行商问题(此问题,说白了就是如何求解n个不同字母的所有不同排 ...

随机推荐

  1. 【UOJ #110】【APIO 2015】Bali Sculptures

    http://uoj.ac/problem/110 这道题subtask4和subtask5是不同的算法. 主要思想都是从高位到低位贪心确定答案. 对于subtask4,n比较小,设\(f(i,j)\ ...

  2. HDU 1057 What Are You Talking About trie树 简单

    http://acm.hdu.edu.cn/showproblem.php?pid=1075 题意 : 给一个单词表然后给一些单词,要求翻译单词表中有的单词,没有则直接输出原单词. 翻译文段部分get ...

  3. 【20181023T3】“新”的家园【虚图】

    打死也不告诉你这个名字是我编的 题面 [错解] 哎最短路欸 哎floyd+dijkstra有30分 骗分骗分 [正解] 我们发现n和m(不是E)不是一个数量级的 也就是说,在做传统最短路的时候,很多时 ...

  4. BZOJ 1030 [JSOI2007]文本生成器(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...

  5. 【期望DP】BZOJ2134- 单选错位

    [题目大意] 有n道题,第i道题有ai个选项.一个人把所有的正确答案填到了后面一题上(特殊的,当i=n的时候填到1上),问他期望做对几道题? [思路] 沙茶题……显然每道题的期望是独立的. 对于某道题 ...

  6. Markdown---锚点使用

    Markdown目前还没有支持文内锚点的标记语法:但是支持html,所以锚点可以通过html语法来实现 使用方法 <a href='#jump'>第一个题目</a> 带有锚点的 ...

  7. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用

    Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...

  8. obd2 J1962M to DB9

  9. MP2359 1.2A, 24V, 1.4MHz Step-Down Converter in a TSOT23-6

    The MP2359 is a monolithic step-down switch mode converter with a built-in power MOSFET.It achieves ...

  10. setTimeout你知多少

    假期这么快就结束了,其实对我来说没什么影响,因为我一周才两节课,对于课多的同学来说,我天天在休假,不要羡慕哟~  但休假并不代表闲着,还是得苦逼的编代码,唉..一入程序深似海.. 不管学得多少,还是总 ...