码迷,mamicode.com
首页 > 其他好文 > 详细

多个有序数列中查找第k小值

时间:2014-10-24 22:18:36      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   ar   使用   sp   div   on   

        问题描述:现有n个有序序列如(2,3,9),(3,5,11,23),(1,4,7,9,15,17,20),(8,15,35,9),(20,30,40),请求出第k小值。


     问题分析:可用多路归并排序将所有序列进行排序后取第k个值,但是只要求求出第k小值将所有数组排序未免显得有点浪费,所以我们可以使用包含k个元素的堆完成,对于每组元素取出前k小的,依次进行比较,得到总的前k小


     执行步骤:

一、建初堆:从第一组数中取出前k小的元素建初始大根堆(若不足k个则取全部元素),

bubuko.com,布布扣
bubuko.com,布布扣

二、

1 、补充堆:若堆中元素不足k个,则从下一组数中获取来补足

2、与该组元素比较:否则从下一组的第一个元素开始,依次与堆顶元素比较,

       (1)若小于堆顶元素,则将该元素与堆顶元素交换,调整堆,从该组的下一个元素开始重复第2部的操作一直到该组的第k个数

      (2)剪枝:若大于堆顶元素,说明后面的均会大于堆顶元素,则结束该组的比较操作

三、循环进行二的操作,直到所有数组比较完毕

四、堆顶元素即为第k小的元素


    举例说明:以题目序列为例,k为5

一、建初堆,因为数组一只有三个元素,所有初始堆为三个元素

bubuko.com,布布扣

1、补充堆,因为堆中元素不足5个,所有用第二组元素将堆补充完整,得:

bubuko.com,布布扣

2、第二组第三个元素为11,大于堆顶元素9,属于第(2)种情况,要剪枝,所以第二组后面元素不再与堆顶元素比较

三、从第三组数到第n组数,依次执行第二步的操作

四、最终得出的堆为

bubuko.com,布布扣

所以第五大元素为堆顶元素4


多个有序数列中查找第k小值

标签:style   blog   http   color   ar   使用   sp   div   on   

原文地址:http://blog.csdn.net/charmingcui/article/details/40424105

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!