我需要创建一个python函数,给定有序列表<option>
和a
返回b
如果a中存在一个项目,则认为True
中有一个项目1}}即b
。
这当然可以通过以下方式轻松完成:
a+1
但是,我需要尽可能提高效率,因为该函数将用于处理数据负载。给我的提示是使用for item in a:
if (a+1 in b):
return True
和iter()
操作,但我还没有找到一种方法来使用它们进行有效的处理。有谁知道如何实现这些,或使用另一个快速的algorythm?
提前谢谢。
答案 0 :(得分:1)
我可以看到两个效率更高的选项。
a
中的每个元素,并在element+1
中对b
执行二进制搜索。时间复杂度:O(n * log(m))其中n = |a|
且m = |b|
。
for element in a:
if binary_search(a, element+1):
return True
return False
|a|
)和[0,|b|
)增加两个计数器,比如i
和j
。在i
小于|a|
且j
小于|b|
时循环。将a[i] + 1
与b[j]
进行比较。如果它们相等,则返回True
。如果值a[i] + 1 > b[j]
,则增加j
。否则,请增加i
。时间复杂度:O(n + m)其中n = |a|
且m = |b|
。
i = 0
j = 0
while i < len(a) and j < len(b):
if a[i] + 1 == b[j]:
return True
elif a[i] + 1 > b[j]:
j += 1
else:
i += 1
return False
答案 1 :(得分:1)
警告:代码测试不是很好。假设您编写了排序列表。
iter
和next
提示背后的想法是,在一个循环中,您可以在一个或另一个列表中前进。如果第一个数字太小,则尝试下一个第一个数字。如果第二个太小,则尝试文本第二个数字。
def test1(a, b):
ia = iter(a)
ib = iter(b)
try:
ea = next(ia)
eb = next(ib)
while True:
print("debug: comparing {} -- {}".format(ea, eb))
diff = ea - eb
if diff == -1:
print("debug: OK!")
return True
elif diff < -1:
ea = next(ia)
else:
eb = next(ib)
except StopIteration:
print("debug: not found")
return False
lista=[1,2,4,10,31,33,45,67]
listb=[7,16,22,29,34,39,49,59,60,100,200,300]
test1(lista, listb)
输出显示算法正在运行:
debug: comparing 1 -- 7
debug: comparing 2 -- 7
debug: comparing 4 -- 7
debug: comparing 10 -- 7
debug: comparing 10 -- 16
debug: comparing 31 -- 16
debug: comparing 31 -- 22
debug: comparing 31 -- 29
debug: comparing 31 -- 34
debug: comparing 33 -- 34
debug: OK!
答案 2 :(得分:0)
谢谢你们的回答!我最终使用了您的解决方案的组合版本:
a = iter(l1)
b = iter(l2)
i = next(a)
j = next(b)
try:
while (i):
if i + 1 == j:
return True
elif i + 1 > j:
j = next(b)
else:
i = next(a)
except StopIteration:
return False