在整数的大整数文件中查找中位数

时间:2018-10-22 00:56:10

标签: python algorithm sorting

在下面的采访中有人问我。我没有得到,但试图在家解决。我相信我们必须使用中位数算法...

  

Q:在大整数文件中查找中位数

     

从大型整数文件中找到中位数。您无法访问   按索引编号,只能顺序访问。和数字   无法容纳在内存中。

我在网上找到了一个解决方案(使用Python重写),但是有些事情我不理解。我有点了解算法,但不确定100%。

a)为什么我们要检查left >= right

b)当count < k时,我们称为self.findMedianInLargeFile(numbers,k,max(result+1,guess),right)。为什么将max(result+1, guess)称为left

c)当count > k时,为什么我们将result用作right

class Solution:

def findMedianInLargeFile(self, numbers,k,left,right):

    if left >= right:
        return left

    result = left
    guess = (left + right ) // 2
    count = 0

    # count the number that is less than guess

    for i in numbers:
        if i <= guess:
            count+=1
            result = max(result,i)

    if count == k:
        return result
    elif count < k: # if the number of items < guess is < K
        return self.findMedianInLargeFile(numbers,k,max(result+1,guess),right)
    else: 
        return self.findMedianInLargeFile(numbers,k,left,result)



def findMedian(self, numbers):
    length = len(numbers)

    if length % 2 == 1: # odd
        return self.findMedianInLargeFile(numbers,length//2 + 1,-999999999,999999999)
    else:
        return (self.findMedianInLargeFile(numbers,length//2,-999999999,999999999) + self.findMedianInLargeFile(numbers,length//2 +1 ,-999999999,999999999)) / 2

2 个答案:

答案 0 :(得分:2)

这只是中间值的binary search

与示例代码进行比较

function binary_search(A, n, T):
    L := 0
    R := n − 1
    while L <= R:
        m := floor((L + R) / 2)
        if A[m] < T:
            L := m + 1
        else if A[m] > T:
            R := m - 1
        else:
            return m
    return unsuccessful
  • if left >= right:在有边界时停止迭代 碰撞

  • count < k时,我们称self.findMedianInLargeFile(numbers,k,max(result+1,guess),right)是因为我们的猜测太小,并且中值大于所求值。

  • else情况下类似但相反的情况

答案 1 :(得分:0)

您可以在外部存储器上使用-O(nlogn)进行合并排序,因为它被实现为按顺序对数据进行操作。

一个有趣的解决方案可能是通过订单统计树,其实现在此处:Median of large amount of numbers for each sets of given size

但是,如果您有任何疑问,请告诉我!