您的位置:首页 > 其它

关于在一个序列中寻找中位数和第K大的数(在两个等长有序数组中寻找中位数)

2012-10-09 11:16 330 查看
现有两个数组A和B长度都为n,且每个数组中的元素都是升序排列,设计一个在时间空间上都尽可能高效的算法,来寻找两个数组整体上的中位数。

1.
Merge排序选择第n和n+1个即可,但是这个复杂度是O(2*n)的,空间是O(n+1)的,因为找到第n和n+1个停止即可,不需要继续进行归并。

2.
败者树,其实这个在时间复杂度上没有优化也是O(2*n)的,但是在空间复杂度上进行了一定的优化为C级别的。

3.
使用快速排序的思想,在整体上进行位置的查找,如果找到的位置大于n+1在向左半部分查找,如果小于n则想右半部分查找,直至找到适合的位置位置,这样的时间复杂度约为O(n*logn/2),但是空间复杂度为O(2*n)

4.
经典中的经典是二分查找和分治思想的融合/article/9204184.html,创造出一个复杂度为O(logn)的算法,且空间复杂度为C级别的。当然这个不是自己想到的,参考网址在上面的url中。

此外,对于查找中位数,其他常用的方法还有堆排序、桶排序,在海量数据寻找中位数的时候感觉使用多层桶划分是非常有效的方法,当然此时也可以使用多路归并排序或败者树或堆排序的思想来实现。对于上面的使用分治和二分查找思想综合的是对于可放入内存的有序数组而言的。

对于查找第K大的数,常用的就是堆排序、败者树、快排、归并排序等方法来实现,常用的还是前两种算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: