比较两组元组A和B以找到大小兼容性

时间:2019-04-02 04:08:18

标签: python recursion merge compatibility

假设我们有n种床型,并调查了n个人。 令B = {b1,。 。 。 ,bn}是二维空间中n个点的集合,代表床的尺寸 类型。我们写bi =(bi(x),bi(y)),其中bi(x)代表床型i的长度,bi(y)表示其宽度。 同样,我们用P = {p1,。。表示n个人的要求。 。 。 ,pn},其中n个点的集合 二维空间,我们也写pj =(pj(x),pj(y)),其中pj(x)和pj(y)是人j的长度 和宽度要求。 点碧 当且仅当bi(x)≥pj(x)并且bi(y)≥pj(y)时,才与点pj兼容。相容性 的 是它兼容的P的点数,如果兼容,我们写comp(bi)= k k点为p。

我们将从更简单的一维情况开始,即P = {p1,。 。 。 ,pn}和B = {b1,。。 。 。 ,bn}是 一维空间中的点(多个点可能具有相同的值)。您的任务是设计一个 O(n log n)时间算法,计算B中每个点与P的兼容性。

我当时正在考虑使用二进制搜索来定位索引,该索引的B值大于P(已排序)的值,并且索引位置+1应该是与我所床兼容的人数寻找。我使用for循环遍历代表床的元组集合,并通过集合P进行二元搜索,以找到索引并在每个最终步骤进行打印以输出。

def binarySearch(arr,l,r,x):

    if r >= 1: #base case size must be greater or equal to 1

        mid = (r-1)//2 + 1
        if float(arr[mid][1] == float(x)) and float(arr[mid+1][1] == float(x)) and mid <= r-1:
            mid += 1    
        elif float(arr[mid][1]) <= float(x) and float(arr[mid+1][1]) > float(x):
            return mid
        if float(arr[mid][1]) >= float(x):
    #   if arr[mid][1] <= x:
            return binarySearch(arr,l,mid-1,x)
        else:
            return binarySearch(arr,mid+1,r,x)
    else:
        return -1


for i in range(len(b)): #p is set of sorted persons and b is set of beds

    x = b[i][1]

    numCompatible = binarySearch(p,0,len(p),x) + 1

    print(b[i][0],numCompatible)

我收到一个错误:

  

“ RecursionError:在比较中超出了最大递归深度”,预期输出为   b1 10   b10 5   b11 11   b12 5   b13 5   b14 15   b15 13   b16 5   b2 3   b3 9   b4 10   b5 12   b6 9   b7 10   b8 4   b9 3

0 个答案:

没有答案