等长排序数组的中位数

Posted

技术标签:

【中文标题】等长排序数组的中位数【英文标题】:Median of sorted arrays of equal length 【发布时间】:2020-11-18 21:06:35 【问题描述】:

我正在尝试找到两个相同长度的排序数组的中位数,我正在使用分治算法。但是我的代码返回 None 而不是一个值 这是查找单个数组中位数的代码:

def getmedian(li):
    x = len(li)
    if x%2 == 0:
        return (li[x//2] + li[(x//2)-1])/2
    else:
        return li[(len(li)-1)//2]

然后我对两个数组使用以下函数:

def TwoList(list1,list2):
    if len(list1) == 1:
        return (list1[0] + list2[0])/2
    elif len(list2)== 2:
        return (max(list1[0],list2[0]) + min(list2[1], list1[1]))/2
    else:
        #pdb.set_trace()
        x = getmedian(list1)
        y = getmedian(list2)
        if x == y:
            return x
        elif x > y:
            if len(list1)%2==0:
                TwoList(list1[:len(list1)//2], list2[len(list1)//2:])
            else:
                TwoList(list1[:len(list1)//2+1], list2[len(list1)//2:])
        else:
            if len(list1)%2==0:
                TwoList(list1[len(list1)//2:], list2[:len(list1)//2])
            else:
                TwoList(list1[len(list1)//2:], list2[:len(list1)//2+1])

【问题讨论】:

【参考方案1】:

看起来你做对了,除了在TwoList递归调用中返回值。 请看下面的代码,在你必须return值的地方注释。

def getmedian(li):
    x = len(li)
    if x%2 == 0:
        return (li[x//2] + li[(x//2)-1])/2
    else:
        return li[(len(li)-1)//2]

def TwoList(list1,list2):
    if len(list1) == 1:
        return (list1[0] + list2[0])/2
    elif len(list2)== 2:
        return (max(list1[0],list2[0]) + min(list2[1], list1[1]))/2
    else:
        #pdb.set_trace()
        x = getmedian(list1)
        y = getmedian(list2)
        if x == y:
            return x
        elif x > y:
            if len(list1)%2==0:
                return TwoList(list1[:len(list1)//2], list2[len(list1)//2:]) # return value
            else:
                return TwoList(list1[:len(list1)//2+1], list2[len(list1)//2:]) # return value
        else:
            if len(list1)%2==0:
                return TwoList(list1[len(list1)//2:], list2[:len(list1)//2]) # return value
            else:
                return TwoList(list1[len(list1)//2:], list2[:len(list1)//2+1]) # return value

print(TwoList([1,2,3,4],[5,6,7,8]))

【讨论】:

@DhruvMakwana 很高兴为您提供帮助 :-)

以上是关于等长排序数组的中位数的主要内容,如果未能解决你的问题,请参考以下文章

[二分查找] 两个等长有序数组的上中位数

算法作业!!求两个不等长有序数组的中位数!

算法第二章上机实践报告

两个等长的升序序列,找合并之后的中位数

线性表练习之Example029-求两个等长升序序列 A 和 B 的中位数

中位数: 给定一个未排序的整数数组,找到其中位数。