- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第一题:1、有两个已排好序的数组A和B,长度均为n,找出这两个数组合并后的中间元素,要求时间代价为O(logn)。2、假设两个有序数组长度不等,同样的求出中位数。解析: 这个题目看起来非常简单。第一题的话: 假设数组长度为n, 那么我就把数组1和数组2直接合并,然后再直接找到中间元素。对于这样的方案,第一题和第一题就没有什么区别了。这样的话时间复杂度就是O(n)。通常在 这样的情况下,那些要求比较高的面试官就会循循善诱道:“你还有更好的办法吗?” 如果比线性更高效,直接能想到的就是对数了O(log(n)),这个时间复杂度在这里可能吗? 当然还是可能的。算法导论上面的分析是这样的:Say the two arrays are sorted and increasing, namely A and B.It is easy to find the median of each array in O(1) time.Assume the median of array A is m and the median of array B is n. Then,1、If m==n,then clearly the median after merging is also m,the algorithm holds.2、If m=n,then reserve the half of sequence A in which all numbers are greater than m,also reserve the half of sequence B in which all numbers are smaller than n.Run the algorithm on the two new arrays。3、If mn,then reserve the half of sequence A in which all numbers are smaller than m,also reserve the half of sequence B in which all numbers are larger than n.Run the algorithm on the two new arrays。Time complexity: O(logn)下面,我们来画个图,分析一下这个思路:我们先来分析看看: 想到对数的效率,首先想到的就是二分查找,对于这个题目二分查找的意义在哪里呢?我们找到了A[n/2] 和 B[n/2]来比较,1、如果他们相等,那样的话,我们的搜索结束了,因为答案已经找到了A[n/2]就肯定是排序后的中位数了。2、如果我们发现B[n/2] A[n/2],说明什么,这个数字应该在 A[n/2]-A[n]这个序列里面, 或者在 B[1]-B[n/4]这里面。 或者,这里的或者是很重要的, 我们可以说,我们已经成功的把问题变成了在排序完成的数组A[n/2]-A[n]和B[0]-B[n/2]里面找到合并以后的中位数, 显然递归是个不错的选择了。3、如果B[n/2] A[n/2]呢?显然就是在A[0]-A[n/2]和B[n/2]-B[n]里面寻找了。在继续想, 这个递归什么时候收敛呢?当然一个case就是相等的值出现, 如果不出现等到这个n==1的时候也就结束了。照着这样的思路, 我们比较容易写出如下的代码, 当然边界的值需要自己思量一下(递归代码如下):
[cpp] view plaincopyprint?
//?两个长度相等的有序数组寻找中位数??
int?Find_Media_Equal_Length(int?a[]?,?int?b[]?,?int?length)??
{??
????if(length?==?1)??
????{??
????????return?a[0]??b[0]???b[0]?:?a[0];??
????}??
????int?mid?=?(length-1)/2;???//奇数就取中间的,偶数则去坐标小的??
????if(a[mid]?==?b[mid])??
????????return?a[mid];??
????else?if(a[mid]??b[mid])??
????{??
????????return?Find_Media_Equal_Length(a[length-mid-1]?,?b[0]?,?mid+1);????//偶数则取剩下的length/2,奇数则取剩下的length/2+1??
????????//return?Find_Media_Equal_Length(a+length-mid-1?,?b?,?mid+1);??
????
文档评论(0)