算法第二章上机实践报告
1、实践题目 7-3
2、问题描述
输入两个长度为\(N\)的升序有序序列,输出他们归并后的序列的中位数
要求算法时间复杂度为\(O(logN)\)
3、算法描述
第一次没仔细审题,写了个\(O(N)\)的归并,归并到\(2(N-1)/2\)的地方就输出了。
后来重写了一次,用的是二分的做法,先分别求出两个序列的中位数,比较二者的大小,将较小者左边的数舍去,较大者右边的数舍去,要保证两个序列舍去的数的数量相同。
4、算法时间及空间复杂度分析
每次分别求中位数的时间复杂度为\(O(1)\),划分区间的时间复杂度\(O(1)\),根据算法复杂度分析主定理计算得
时间复杂度\(O(logN)\)。
此算法只需要常数个额外变量,空间复杂度为\(O(1)\)。
代码:
n = int(input())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
l1 = l2 = 0
r1 = r2 = len(a) - 1
flag = 0
while (l1 < r1) or (l2 < r2):
m = l1 + r1 >> 1
M = l2 + r2 >> 1
if a[m] == b[M]:
flag = 1
ans = a[m]
break;
elif a[m] < b[M]:
if (l1 + r1)%2 == 0:
l1 = m
r2 = M
else:
l1 = m+1
r2 = M
else:
if (l1 + r1)%2 == 0:
l2 = M
r1 = m
else:
l2 = M+1
r1 = m
if flag:
print(ans)
else:
print(min(a[l1],b[l2]))
5、心得体会
算法出问题的时候可以动手模拟一下运行过程。当时没有判断奇偶的影响,就是靠模拟过程发现了问题

浙公网安备 33010602011771号