关于在一个序列中寻找中位数和第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大的数,常用的就是堆排序、败者树、快排、归并排序等方法来实现,常用的还是前两种算法。
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大的数,常用的就是堆排序、败者树、快排、归并排序等方法来实现,常用的还是前两种算法。
相关文章推荐
- 两个有序数组合并后找第k个数(中位数)
- 寻找两个有序数组的第k小的数
- 寻找两个有序数组合并之后的中位数
- 求两个等长有序数组中位数算法问题
- 求两个不等长的有序数组的中位数
- 求两个等长的有序序列的中位数(2011计算机统考试题)
- 2-13. 两个有序序列的中位数(25)(ZJU_PAT 链表 | 数组 )
- 查找两个有序数组的中位数和第K小的数
- 求两个等长有序数组的中位数的logN算法 分治法
- 寻找两个不等长数组的中位数 Median of Two Sorted Arrays
- 求两个等长有序数组的中位数
- ~~~~(>_<)~~~~Median of Two Sorted Arrays:两个有序数组寻找中位数
- 从两个有序数组的并集中寻找第k小元素
- 求两个等长有序数组的中位数的logN算法 分治法
- 求两个等长有序数组的中位数的logN算法 分治法
- 从两个有序数组的并集中寻找第k小元素
- 求两个等长有序数组的中位数的logN算法 分治法
- (1.2.4.2)寻找两个有序数组中的第K个数或者中位数
- 求两个有序非等长数组中位数
- 两个有序数组中找中位数或者第K大的元素