[英]Fastest way of checking if two lists have at least 2 common items in Python?
a={}
t= list(map(int,input().split()))
n=t[0]
k=t[1]
for i in range(n):
a.update({i:[]})
ids=[]
for i in range(n):
k=input().split()
ids.append(set(k[1:]))
def ifrel(i, j):
if i==j:
return False
return len(ids[i] & ids[j]) >= 2
for i in range(n):
for j in range(n):
if ifrel(i,j):
a[i].append(j)
stack=[]
res=[]
def iterdfs(g,s):
stack.append(s)
while stack!=[]:
k=stack.pop()
if k not in res:
res.append(k)
for i in g[k]:
if i not in res:
stack.append(i)
return res
print(len(iterdfs(a,0)))
这是使用Set的最终解决方案,但我仍然获得TLE!
ids []是包含列表的列表,例如:ids = [['1','2','3']]。 使用字典会提高速度吗?
我在编辑时有些麻烦,因为这是我在Stack Overflow中遇到的第一个问题。
我要解决的问题是: https : //www.codechef.com/IOIPRAC/problems/INOI1302/
如果您想要最快的解决方案,那么它就不会很简洁。 这是最糟糕的情况O(A + B)的尝试,但是一旦找到两个匹配项就会退出,最好的情况是Ω(B),其中B是两个列表中较短的一个。
def check_common_items(A, B, n=2):
# set B to be the shorter list, len is O(1)
if len(B) < len(A):
A, B = B, A
B_set = set(B) # O(len(B))
count = 0
for a in A: # worst case O(len(A))
if a in B_set: # O(1)
count += 1
if count == n:
return True
return False
但是,大多数使用集合的实现将渐近有效。 例如,以下功能可能不会太慢。
def check_common_items(A, B, n=2):
return len(set(A) & set(B)) >= n
使用一套。
In [1]: lst1 = [1, 2, 3, 4]
In [2]: lst2 = [3, 4, 5, 6]
In [3]: set(lst1).intersection(set(lst2))
Out[3]: {3, 4}
In [4]: len(set(lst1).intersection(set(lst2)))
Out[4]: 2
def check(list1,list2):
if len([elem for elem in set(list1) if elem in list2])>=2:return True
return False
使用此功能。 它会列出常见项目,并检查列表的长度。
您需要提出一种更有效的算法,而不是对照两个列表的全部内容,而是可以在确定两个重复项后终止:
a = ['some', 'list']
b = ['some', 'other', 'list']
duplicate_count = 0
my_bool = False
for item in a:
if item in b:
duplicate_count += 1
if duplicate_count >= 2:
my_bool = True
break
在最坏的情况下,该算法仍为O(n 2 ),但有可能尽早终止
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.