牛客网错题(3)

1.某单CPU系统中有输入和输出设备各1台,现有3个并发执行的作业,每个作业的输入、计算和输出时间均分别为2ms、3ms和4ms,且都按输入、计算和输出的顺序执行,则执行完3个作业需要的时间最少是 。
A.15ms
B.17ms
C.22ms
D.27ms
分析:
按流水线执行时所需时间最短。
流水线计算公式为:1条指令执行时间+(指令条数-1)*流水线周期。
1条指令执行时间是完整的输入+计算+输出时间,也就是2ms+3ms+4ms=9ms
流水线的周期为执行时间最长的一段,也就是4ms
所以按流水线执行后所需的时间为9+(3-1)*4 = 17ms
2.已知两个长度分别为m 和 n 的升序链表,若将它们合并为一个长度为 m+n 的降序链表,则最坏情况下的时间复杂度是( )。
A.O(n)
B.O(m+n)
C.O(min(m ,n))
D.O(max(m,n))
分析:
这道题答案个人觉得应该为D。虽然确实比较次数最多是m+n(实际最多是m+n-1次)。
【先来总结】
最多比较次数,m+n-1
最少比较次数,min(m,n)
(注意时间复杂度和具体的执行次数完全是两码事)
最坏时间复杂度O(max(m,n))
最好时间复杂度O(min(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=108时,O(min(m,n))=O(1),O(max(m,n))=O(108),所以O(m+n)和O(min(m,n))不等价。
但是个人觉得这种方法有点为了“解释答案”而去解释,正常人谁能想到还要用夹逼定理去算时间复杂度???

3.所以我觉得直接从本质上考虑就好,这种算法的本质:就是两个表进行比较,其中一个表比较完之后,剩下的直接插入。因此最好的情况,不用想的太复杂,其实就只是短的那个表比较完了:O(min(m,n))。而最坏的情况,就只是长的那个表比较完了:O(max(m,n))。
从编码的角度看,两个有序顺序表合并一个新的有序顺序表中,核心算法如下:

while(i<A.length && j<B.length){
       //循环两两比较,小的存入结果
    if(A.data[i]<B.data[j])
        C.data[k++]=A.data[i++];
    else
        C.data[k
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值