九章算法面试题8 第k大的数
2015-05-12 12:52
239 查看
九章算法官网-原文网址:
http://www.jiuzhang.com/problem/8/
题目
【初阶】有两个数组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台机器的并行计算能力,所以想到让每台机器互不相关的做一件事情,然后将结果汇总来判断。
一般来讲,面试中问题这两个题目,说明职位对算法能力的要求还是比较高的。
相关文章推荐
- 九章算法面试题64 找第k大的特殊数
- 九章算法面试题77 插入区间
- 九章算法面试题7 分层遍历二叉树
- 九章算法面试题19 最常访问IP
- 九章算法面试题34 最长01子串
- 九章算法面试题59 背包问题II
- lintcode&九章算法——Google面试题 | 有效括号字符串 ? 待解决
- 九章算法面试题83 把0移到数组右边
- 九章算法面试题20 寻找重复的URL
- 九章算法面试题35 构造最大数
- 九章算法面试题44 设计一个Web Crawler
- 九章算法面试题60 爬楼梯
- 九章算法面试题84 奇偶分割数组
- 九章算法面试题9 前k大的和
- 九章算法面试题21 寻找最近单词对
- 九章算法面试题34 最长01子串
- 九章算法面试题45 寻找最大的储水容器
- 九章算法面试题61 克隆图
- 九章算法面试题85 搜索区间
- 九章算法面试题22 扔棋子