题目:
链接:https://www.nowcoder.com/questionTerminal/47d9d6dce7f140a5a2654fb852f118c8?toCommentId=379084
来源:nowcoder一位大连理工的老师的评论
解析:
这道题答案个人觉得应该为D。虽然确实比较次数最多是m+n次。
1.贡献时间复杂度的不是“移动”次数,而是“比较”,如果从“移动”的角度上考虑,不管是什么情况,它都移动了m+n次。
2.不管是O(m)也好,还是O(n),都是常数项级的时间复杂度,从“级数”的角度考虑,O(m+n),O(min(m,n)),O(max(m,n))都是线性变化的常数项级,这三个的“级数”是一致的。
所以对于楼上的“因为O(m+n)等价于O(max(m, n))”的回答并不是十分认同,个人觉得有点牵强。如果在答案里同时存在O(m+n)和O(max(m,n))该怎么选呢?而另外的一个O(min(m,n))也是常数级线性变化啊。
【刷帖的时候,看有人说王道视频证明了O(max(m,n))等价于O(m+n)】
就是m+n>=max(m,n)并且m+n<=2max(m,n),所以O(m+n)和O(max(m,n))等价,有点夹逼定理的感觉。
如果m=1,n= 1 0 8 10^8 108时,O(min(m,n))=O(1),O(max(m,n))= O ( 1 0 8 ) O(10^8) O(108),所以O(m+n)和O(min(m,n))不等价。
但是个人觉得这种方法有点为了“解释答案”而去解释,正常人谁能想到还要用夹逼定理去算时间复杂度???
3.所以我觉得直接从本质上考虑就好,这种算法的本质:就是两个表进行比较,其中一个表比较完之后,剩下的直接插入。因此最好的情况,不用想的太复杂,其实就只是短的那个表比较完了:O(min(m,n))。而最坏的情况,就只是长的那个表比较完了:O(max(m,n))。
从编码的角度看,两个有序顺序表合并一个新的有序顺序表中,核心算法如下:
while(i<A