第k大的数——分治法
来源:互联网 发布:opencv 灰度共生矩阵 编辑:程序博客网 时间:2024/05/01 15:44
问题描述:
初阶:有两个数组A和B,假设A和B已经有序(从大到小),求A和B数组中所有数的第K大。
进阶:有N台机器,每台机器上有一个有序的大数组,需要求得所有机器上所有数中的第K大。注意,需要考虑N台机器的并行计算能力。
思路:
初阶:比较A[k/2]和B[k/2],如果A[k/2]>=B[k/2]那么A的前k/2个数一定都在前k-1大中,将A数组前k/2个数扔掉,反之扔掉B的前k/2个数。将k减小k/2。重复上述操作直到k=1。比较A和B的第一个数即可得到结果。时间复杂度O(logk)
进阶:二分答案S,将S广播给每台机器,每台机器用二分法求得有多少比该数小的数。汇总结果后可判断是该将S往上还是往下调整。
面试官角度:
初阶问题是一个难度比较大的算法题。需要有一定的算法训练功底。主要用到的思想是递归。首先容易想到的方法是合并两个数组(见面试题5,有序数组的合并),这样复杂度为O(k),那么答出这个以后,面试官会问你,还有更好的方法么?这个时候就要往O(logk)的思路去想,O(logk)就意味着需要用一种方法每次将k的规模减小一半,于是想到,每次要扔掉一个数组或两个数组中的k/2个数,于是想到去比较A[k/2]和B[k/2],仔细思考比较结果,然后想到较大的那一方的前k/2个数一定都在前k-1大的数中, 所以可以扔掉。
进阶问题的考察点是逆向思维。二分答案是一种常见的算法思路(见面试题2 抄书问题),所以当你想不出题目的时候,往往可以试试看是否可以二分答案。因为需要发挥N台机器的并行计算能力,所以想到让每台机器互不相关的做一件事情,然后将结果汇总来判断。
一般来讲,面试中问题这两个题目,说明职位对算法能力的要求还是比较高的。
参考资料:http://www.jiuzhang.com/problem/8/
0 0
- 第k大的数——分治法
- 分治法 快排 输出第k大的数
- 分治-寻找第k小的数
- 第K大元素(分治法)
- 第K大的数
- 第k大的数
- 第k大的数
- 第K大的数
- 第k大的数
- 第K大的数
- 第K大的数
- 第K大的数
- 第K大的数
- 分治算法求N个数中第K小(大)的数
- leetcode 215:Kth Largest Element in an Array ( 分治-求第k小的数,第k大的数)
- 得到第K个大的数
- 找第k大的数
- 求第K大的数~~
- 写在开篇
- Android中用GridView实现九宫格的两种方法
- 开门见iOS(3)-了解Xcode
- source insight支持object-c显示的设置
- visual studio如何自定义快捷键
- 第k大的数——分治法
- 5月总结
- vector相关的模板类函数声明与实现
- 请输入标题 请输入文本内容
- Currency campus line of digital red song celebrates victory 70 years
- windows 下安装nodejs及其配置环境
- oracle 使用comment语句添加表注释
- 小谈虚函数实现动态绑定(多态)
- Linux系统下如何查看已经登录用户