首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

找两个升序序列中位数的有关问题

2013-04-09 
找两个升序序列中位数的问题一个长度为L(L≥1)的升序序列S,处在第[L/2]个位置的数称为s的中位数。例如,若序

找两个升序序列中位数的问题
一个长度为L(L≥1)的升序序列S,处在第[L/2]个位置的数称为s的中位数。例如,若序列S1:(11,13,15,17,19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。

算法思路是:
分别求两个升序序列A、B的中位数,设为a和b。
若a=b,则a或b即为所求的中位数;
否则,舍弃a、b中较小者所在序列之较小一半,
同时舍弃较大者所在序列之较大一半,要求两次舍弃的元素个数相同。
在保留的两个升序序列中,重复上述过程,直到两个序列中均只含一个元素时为止,则较小者即为所求的中位数。

我对于红色字体部分不理解,这个舍弃是怎么想到的? 
为什么一直舍弃后处理最终找到的就是结果?
[解决办法]
若a<b,则肯定不在S1的左半边,因为如果在S1的左半边则中位数<a<b,即也在S2的左半边,在整个S1+S2中
也是在左半边,不是在中点,与中位数矛盾;同理不在s2的右半边

若a>b时,原理同上

当S1长度为奇数时,左半边=右半边,直接舍弃即可
当S1长度为偶数时,左半边+1=右半边。若a<b,舍弃a的左半边(包括中点) 舍弃b的右半边(保留中点)
始终保持S1 S2等长
[解决办法]

引用:
若a<b,则肯定不在S1的左半边,因为如果在S1的左半边则中位数<a<b,即也在S2的左半边,在整个S1+S2中
也是在左半边,不是在中点,与中位数矛盾;同理不在s2的右半边

若a>b时,原理同上

当S1长度为奇数时,左半边=右半边,直接舍弃即可
当S1长度为偶数时,左半边+1=右半边。若a<b,舍弃a的左半边(包括中点) 舍弃b的右半边(保留中点)
始终保持S1 S2等长


LS正解。这样相当于折半查找,效率很高

热点排行