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
这是我想到的三种个方法,自己能力有限,菜鸟一枚,欢迎大家给出更多好的方法。