在下面的采访中有人问我。我没有得到,但试图在家解决。我相信我们必须使用中位数算法...
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
答案 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
但是,如果您有任何疑问,请告诉我!