您的位置:首页 > 职场人生

新浪实习生面试题

2016-04-25 22:47 260 查看
200个数组,每个数组100个已排好序的数(从大到小),求出最大的20个数;复杂度。

方法一:

1、200个数组第一个数快排从大到小排好;200log200

2、​取出排好序的第一元素为最大元;

3、将最大元所在数组第二个数取出,折半查找插入相应位置;log200

4、重复2、​3,直到找到20个为止。 19log200

所以时间复杂度为219log200​ 空间复杂度200

方法二:(面试完之后想的)

1、先对200个数组第一个元素的前20个元素快排排好; 20log20

2、将剩下的180个元素插入20个已排好序的数组中,原则:先与20个最大元中的最小元比较,如果大于,则折半查找插入,反之,进行下一个; 180log20

3、按照方法一中的2、3​找出前20个最大元。(这里只需考虑最大20-i+1元所在数组,i为将取出第i个最大元)log19+log18+…+log3+2+1<19log20

所以​时间复杂度小于219log20 空间复杂度20

方法三:(本以为方法二已经很完美了,结果发现还有复杂度更小的,顿感算法之奥妙)

1、先将200组数分成n组,每组m个​,其中n*m=200;

2、对n组元素每组均进行排序(指排第一大);​ 每组复杂度mlogm,则共n*mlogm=200logm;

3、对n组中第一大元素进行排序;nlogn

4、按照方法二中的3步取出最大的20个;19logn

复杂度:200logm+nlogn+19logn=200log(200/n)+(n+19)logn=200log200+(n-181)logn;求导求上述最小值,得到n=25时最佳。

即分成25组,每组8个。为200log200-156log25

​​空间复杂度 25

这是我想到的三种个方法,自己能力有限,菜鸟一枚,欢迎大家给出更多好的方法。​
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: