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

Algorithm of searching for a pair of integers in a list

我对算法还很陌生,我遇到了一个问题,我的方法无法正常解决。 先决条件:

给你一个包含 n 对整数的列表 L=[(a1,b1),…,(an,bn)]。对于任意两对 (ai,bi)∈L(aj,bj)∈L 使得 1≤i≤j≤n ,我们有(至少)三种情况之一:

例如,列表 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 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