Python 在列表中搜索一对整数的算法

Python 在列表中搜索一对整数的算法,python,algorithm,list,divide-and-conquer,Python,Algorithm,List,Divide And Conquer,我对算法很陌生,我遇到了一个问题,我的方法不能正确地解决这个问题这是先决条件: 您将得到一个由n对整数组成的列表L=[(a1,b1),…,(an,bn)]。对于任意两对(ai、bi)∈L和(aj,bj)∈L使1≤我≤J≤n,我们有(至少)三个案例中的一个: ai=aj,bi=bj ai

我对算法很陌生,我遇到了一个问题,我的方法不能正确地解决这个问题这是先决条件

您将得到一个由n对整数组成的列表
L=[(a1,b1),…,(an,bn)]
。对于任意两对
(ai、bi)∈L
(aj,bj)∈L
使1≤我≤J≤n,我们有(至少)三个案例中的一个:

  • ai=aj,bi=bj
  • ai
  • bi
例如,列表
L=[(1,2)、(1,1)]
将无效。有效列表的一个示例是:

L = [(0,1), (1, 0), (0, 1), (1, 1), (1, 2), (3, 1), (3, 1), (2, 2), (2, 3), (3, 2), (2, 3), (4, 3), (3, 4), (4, 4), (4, 5), (5, 5)]
问题是:编写一个递归函数,应用分治范式搜索给定的一对值(x,y)是否在L中

以下是我的python代码,它无法按预期工作:

def pair_search(l, p):
    found = False
    calls = 1

    if len(l) == 0:
        return found, calls
    if len(l) == 1:
        if l[0] == p:
            found = True
        return found, calls

    mid = len(l) // 2

    if p == l[mid]:
        found = True
        return found, calls
    elif (l[mid][0] == p[0] and l[mid][1] == p[1]) or l[mid][0] < p[0] or l[mid][1] < p[1]:
        f, c = pair_search(l[mid + 1:], p)   
    else:
        f, c = pair_search(l[:mid], p)
    found = f or found
    calls += c
    return found, calls   
def对搜索(l,p):
发现=错误
呼叫数=1
如果len(l)==0:
返回找到的呼叫数
如果len(l)==1:
如果l[0]==p:
找到=真
返回找到的呼叫数
mid=len(l)//2
如果p==l[mid]:
找到=真
返回找到的呼叫数
elif(l[mid][0]==p[0]和l[mid][1]==p[1])或l[mid][0]
您总是选择一半,但在某些情况下,您不知道搜索哪一半。您可以执行以下操作来修复它:

def pair_search(l, p):
    if not l:
        return False, 1
    mid = len(l) // 2
    m = l[mid]  # pair in the middle
    if p == m:
        return True, 1
    if p[0] <= m[0] and p[1] <= m[1]:  
        # both smaller (or equal), must be in lower half
        f, c = pair_search(l[:mid], p)
        return f, c + 1 
    if p[0] >= m[0] and p[1] >= m[1]:  
        # both bigger (or equal), must be in upper half
        f, c = pair_search(l[mid+1:], p)
        return f, c + 1 
    # one smaller, one bigger: could be in either half
    f1, c1 = pair_search(l[:mid], p)
    if f1:  # found, so don't look any further
        return f1, c1 + 1
    f2, c2 = pair_search(l[mid+1:], p)
    return f2, c1 + c2 + 1
def对搜索(l,p):
如果不是l:
返回False,1
mid=len(l)//2
M= L[MID]α对对中
如果p==m:
返回True,1
如果p[0]=m[1]:
#较大的(或相等的)必须在上半部分
f、 c=配对搜索(l[mid+1:],p)
返回f,c+1
#一个小的,一个大的:可以在任何一半
f1,c1=成对搜索(l[:中间],p)
如果f1:#找到了,那么不要再看了
返回f1,c1+1
f2,c2=成对搜索(l[mid+1:],p)
返回f2,c1+c2+1

如果您试图应用二进制搜索,您首先应该对
L
进行排序。很高兴为您提供帮助。在条件中更新为大于/小于或等于,以减少某些呼叫。