算法第二章上机实践报告

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、心得体会
算法出问题的时候可以动手模拟一下运行过程。当时没有判断奇偶的影响,就是靠模拟过程发现了问题

posted @ 2018-10-21 15:49  Apale  阅读(142)  评论(0)    收藏  举报