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

时间:2018-09-06 06:20:51

标签: python algorithm list divide-and-conquer

我对算法还很陌生,遇到了一个问题,我的方法无法正常使用。 这是前提

系统会为您提供n对整数的列表L=[(a1,b1),…,(an,bn)]。对于任意两对(ai,bi)∈L(aj,bj)∈L使得1≤i≤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   

1 个答案:

答案 0 :(得分:3)

您总是选择一半,但是在某些情况下,您不知道要搜索哪一半。您可以执行以下操作对其进行修正:

window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "\o/";

 (e || window.event).returnValue = confirmationMessage; //Gecko + IE
   return confirmationMessage;                            //Webkit, Safari, Chrome
 });