【问题标题】:Algorithm of searching for a pair of integers in a list在列表中搜索一对整数的算法
【发布时间】:2019-02-11 08:07:33
【问题描述】:

我对算法很陌生,我遇到了一个问题,我的方法不能正常工作。 这是前提条件

给你一个包含 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   

【问题讨论】:

  • 如果你尝试应用二分搜索,你首先应该对L进行排序。

标签: python algorithm list divide-and-conquer


【解决方案1】:

您总是选择一半,但在某些情况下您不知道要搜索哪一半。您可以执行以下操作来解决它:

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

【讨论】:

  • 很高兴为您提供帮助。在条件中使用更大/更少或等于进行更新以减少一些调用。
猜你喜欢
  • 2012-11-15
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多