用分治算法解决的一个问题,求各位牛人给个方法

u010189776 2013-04-06 11:17:56
利用分治算法:
有两个有序序列:大小分别为m和n。在单元时间内可获得第i个元素。
用一个O(lg m + lgn) t 算法在两个序列中计算出第k大的元素(为了简单,假设两序列元素不等)
虽然知道是要用折半查找,但是不知道怎么实现啊,求帮助!
...全文
100 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
HUANGFEIDIAN 2013-04-07
  • 打赏
  • 举报
回复
引用 2 楼 HUANGFEIDIAN 的回复:
引用 1 楼 reFreever 的回复:利用归并排序的思想 两序列合并为一个序列a。 1.在a中随机选择一个数a[k]进行部分排序,使a中所有大于a[k]的数放在a[k]的前面,小于a[k]的数放在a[k]的后面。 2.假设此时有L个元素小于a[k],M个元素大于a[k],若K<L则在前段部分继续步骤1查找第K大元素,否则在后段部分继续步骤1查找第K-L大元素。终……
有些边界条件我没有处理,在这里只图方便,楼主自己小心。
HUANGFEIDIAN 2013-04-07
  • 打赏
  • 举报
回复
引用 1 楼 reFreever 的回复:
利用归并排序的思想 两序列合并为一个序列a。 1.在a中随机选择一个数a[k]进行部分排序,使a中所有大于a[k]的数放在a[k]的前面,小于a[k]的数放在a[k]的后面。 2.假设此时有L个元素小于a[k],M个元素大于a[k],若K<L则在前段部分继续步骤1查找第K大元素,否则在后段部分继续步骤1查找第K-L大元素。终止条件为查找序列长度为1时。 ……
你这方法是错的,首先利用归并排序时间已经是O(m+n)了。 正确的方法是折半查找: 先对第一个数列进行折半,如果当前数列长度大于2k,则不断折半,直到当前数列长度不大于2k 同理对第二个数列也进行这样的折半,最后得到两个数列的长度都大于k且小于2k。 然后取第一个数列的中位数,即位于中间的元素,折半寻找第二个数列中这个元素应该插入的位置, 设第一个数列中的中位数所在的位置为a,这个数应该插入的位置为b。 如果a+b大于k,则对第一个数列的前a个数与第二个数列的前b个数继续寻找第k个数。 如果a+b小于k,则对第一个数列的后面的那些数与第二个数列的后面的那些数进行递归寻找第k=(k-a-b)个数。 终止条件为k=1,此时选择生成的两个数列中最小的那个数,就是两个数列中第一个数的最小者。
reFreever 2013-04-07
  • 打赏
  • 举报
回复
利用归并排序的思想 两序列合并为一个序列a。 1.在a中随机选择一个数a[k]进行部分排序,使a中所有大于a[k]的数放在a[k]的前面,小于a[k]的数放在a[k]的后面。 2.假设此时有L个元素小于a[k],M个元素大于a[k],若K<L则在前段部分继续步骤1查找第K大元素,否则在后段部分继续步骤1查找第K-L大元素。终止条件为查找序列长度为1时。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧