Python 在列表中搜索一对整数的算法
我对算法很陌生,我遇到了一个问题,我的方法不能正确地解决这个问题这是先决条件: 您将得到一个由n对整数组成的列表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
L=[(a1,b1),…,(an,bn)]
。对于任意两对(ai、bi)∈L
和(aj,bj)∈L
使1≤我≤J≤n,我们有(至少)三个案例中的一个:
- ai=aj,bi=bj
- ai
- bi
- 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
进行排序。很高兴为您提供帮助。在条件中更新为大于/小于或等于,以减少某些呼叫。