选择问题(选最大,选最小,选第k小)

原创 2015年05月08日 22:20:19

选择问题:一个含有n个不相等实数的集合,输出集合中的第i小元素

如果i=1,则为寻找最小元素
如果i=n,则为寻找最大元素
如果i处在集合序列的中间,则为寻找中位数

选最大

算法:顺序比较,首先假定第一个元素为最大,接着最大元素与第二个元素比较,若最大元素小于第二个元素,则两者交换,否则继续与第三个元素比较

最多需要做n-1次比较运算
最坏情况下时间复杂度:W(n)= n-1

选最大最小

同时求最大元素与最小元素

通常算法

  • 先选最大元素
  • 再在剩下的元素中选最小元素(与选最大类似)

时间复杂度:W(n) = n-1 + n -2 = 2n-3

分组算法

  • 将n个元素两两一组,分成n/2组(假设n为偶数)
  • 每组中的两个元素比较,分成较大的跟较小的,所有较大的元素放到一组,较小的元素放到一组,这样就得到n/2个较大元素与n/2个较小元素
  • 在较大的元素中寻找最大元素
  • 在较小的元素中寻找最小元素

时间复杂度:将元素分成较大一组与较小一组一共需要做n/2次比较,在较大元素中寻找最大元素需要做n/2 - 1次比较,寻找最小同理也需要n/2 - 1次比较
所以一共需要:W(n) = 3n/2 - 2

分治算法

  • 将数组从中间划分成两个数组L1与L2
  • 递归地在L1中寻找最大max1与min1
  • 递归地在L2中寻找最大max2与min2
  • max{max1,max2},min{min1,min2}

时间复杂度:W(n) = 2W(n/2) + 2, W(2) = 1
W(n) = 3n/2 -2

选第k小元素

方法1

做k次选最小的算法,时间复杂度W(n) = O(kn)

方法2

先排序然后再输出第k小元素
时间复杂度:O(nlogn)

方法3(分治)

  • 用某个元素m,将数组S分为小于m的部分S1,与大于m的部分S2
  • 如果S1中的元素个数n1>k,则就在S1中寻找第k小的元素,
  • 如果n1 + 1 == k,则m就是第k小的元素
  • 如果(n1 + 1)< k,则就在S2(元素个数n2)中寻找第(k-n1-1)小的元素

但是算法的效率取决于子问题的规模,如何通过m来控制子问题的规模?

  • 可以将数组S分组,比如5个数一组,分成n/5组,每组由大到小排序,中位数放到一个集合M中,取集合M中的中位数作为m来控制子问题规模
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/peach90/article/details/45586575

JSP白皮书

JavaServer PagesTM (JSP)技术为创建显示动态生成内容的Web页面提供了一个简捷而快速的方法。JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与...
  • weqa
  • weqa
  • 2000-09-02 22:48:00
  • 2950

查找第K小元素(C语言版)

关于查找数列中第k小的元素的常见方法: 1、先排序整个数列然后取第k-1个数 2、利用选择排序 3、选择算法 4、利用计数排序的思想 5、利用堆排序思想(一) 6、利用堆排序思想(二)...
  • Thinkpad4180NC5
  • Thinkpad4180NC5
  • 2014-10-22 14:16:11
  • 3397

选择问题——选取第K小元素

今天看到腾讯的一道面试题目,感觉都考的特别基础,但是自己有时候真的是学的不好,所以现在记下来: 查找最小的k个元素 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7,...
  • Yelbosh
  • Yelbosh
  • 2012-12-16 14:22:46
  • 2713

007-寻找第k小元素-分治法-《算法设计技巧与分析》M.H.A学习笔记

在n个元素的数组中查找第k小的元素。Θ(n)
  • qq_18738333
  • qq_18738333
  • 2016-06-27 16:34:30
  • 3915

第K小元素

算法分类: 分治 算法原理: 每次丢弃一部分数组中元素,则问题规模以几何级数递减。 算法步骤: 1.对数组进行分组,分成小于data[k]元素,data[k],以及大于dat...
  • jokes000
  • jokes000
  • 2012-04-24 19:07:14
  • 899

清橙OJ 1082 查找第K小元素 -- 快速排序

题目地址:http://oj.tsinsen.com/A1082 问题描述   给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素。   这是一个补充程序的试题,你需要完成一个函数:...
  • JDPlus
  • JDPlus
  • 2014-02-22 10:15:48
  • 4402

选择问题-第k小元素

问题描述: 在一个无序的序列T中,寻找第k小的元素; 分析: 将序列T进行升序排列,下标为K的元素即为第k小的数。(下标从1开始)。考虑到快速排序的过程,每次进行一次Partition()函数,...
  • STILLxjy
  • STILLxjy
  • 2016-03-27 13:24:34
  • 385

线性时间选择第k小(递归)

利用O(N)时间选择第k小,思路是五个一组,找到五个的中位数,再在中位数里找中位数,作为partition的pivot; #include #include #include using namesp...
  • qq_27601815
  • qq_27601815
  • 2016-12-28 19:49:30
  • 308

找出集合S最接近中位数的k(k≤n)个数

相关问题: 给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k≤n后,它能确定出S中最接近其中位数的k个数. 思考过程: 如果给出在线性时间内的算法,那么可能要用到最坏为线性...
  • z84616995z
  • z84616995z
  • 2014-02-03 16:11:33
  • 2566

《算法导论》选择问题(找第K大的数)

选择问题(Selection Problem),即在n个元素的集合中寻找第K小的元素的问题。
  • Draco_mystack
  • Draco_mystack
  • 2017-04-18 22:24:10
  • 2444
收藏助手
不良信息举报
您举报文章:选择问题(选最大,选最小,选第k小)
举报原因:
原因补充:

(最多只允许输入30个字)