选择问题(选最大,选最小,选第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来控制子问题规模
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Top K算法和寻找第K个最小的数

关于Top K算法和寻找第K个最小的数这种经典问题网上已经说的很详细了,不过毕竟不是自己的,这里自己总结一下,而且这两个问题又稍稍有点区别。 1.Top K算法:即寻找一列数中K个最小值或K个最大值,...

【简单DP】 数字三角形

Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number...

[leetcode-304]Range Sum Query 2D - Immutable

[leetcode-304]Range Sum Query 2D - Immutable
  • hpingwu
  • hpingwu
  • 2015年11月13日 19:48
  • 844

选择问题——选出第K个最大的元素

最近在读《数据结构与算法分析(C语言描述)》,在优先队列(堆)一节中,作者总结了关于“选择问题——求第k个最大的元素”的几种思路,在此简单总结一下:第一种将这NN个数读进一个数组中,再通过某种简单的算...

稀疏矩阵求最小或最大的K个特征值及其特征向量

本人挤牙膏试的文笔,没有习惯写博客,为了方便以后遇到这个问题不要重头再来,也为了有可能能给其他小伙伴一些建议,还是决定整理整理思路,努力写篇大家看得懂的笔记吧。       由于我要处理的问题是求一个...

最大最小问题

  • 2012年06月26日 00:25
  • 1KB
  • 下载

分治算法的利用例子(查找最大最小数,快速排序,查看第k小的数字)

//分治法求最大最小值 import java.util.Scanner; public class num2_1_1 {     public static void max_min(in...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:选择问题(选最大,选最小,选第k小)
举报原因:
原因补充:

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