Python 对照列表列表检查列表中是否存在组合
如果我有一个整数列表Python 对照列表列表检查列表中是否存在组合,python,algorithm,big-o,Python,Algorithm,Big O,如果我有一个整数列表S:[1,2,3],[3,4,5],[5,6,7],还有一个列表T:[2,3,1]。如果T作为一个组合包含在S中,我想返回true。假设S的每个元素的长度与T的长度相同 在这种情况下,我希望返回true 限制:没有任何类型的排序,注意S有所有唯一的列表,但在一个列表中,它可以有重复的元素 我如何才能尽可能有效地做到这一点。我可以遍历S的每个元素,并将其转换为一个集合,然后将其与set(T)进行比较,但是如果S的大小和S的每个元素的长度变大,那么这看起来非常慢。使用iterto
S:[1,2,3],[3,4,5],[5,6,7]
,还有一个列表T:[2,3,1]
。如果T作为一个组合包含在S中,我想返回true。假设S
的每个元素的长度与T
的长度相同
在这种情况下,我希望返回true
限制:没有任何类型的排序,注意S有所有唯一的列表,但在一个列表中,它可以有重复的元素
我如何才能尽可能有效地做到这一点。我可以遍历S
的每个元素,并将其转换为一个集合,然后将其与set(T)
进行比较,但是如果S
的大小和S
的每个元素的长度变大,那么这看起来非常慢。使用itertools
from itertools import combinations
for i in combinations(t, len(t)): if i in s: return True;
或使用已排序的:
t = sorted(t)
for i in s: if sorted(i)==t: return True
您可以使用排序后的
:
>>> S = [[1,2,3],[3,4,5],[5,6,7]]
>>> T = [2,3,1]
>>> any(sorted(T) == sorted(x) for x in S)
True
收款和柜台?它将以O(n)为单位运行,而排序将大致以O(n log n)为单位运行,原始比较将是O(n²)
如果一个约定没有排序,那么您可能需要为组合寻找一个与顺序无关的散列函数。我喜欢的两个起点是:(1)组合中各个元素的散列之和,(2)元组
(和(组合),积(组合))
,我相信线性搜索将是最快的。为了加快速度,可以在分割数组后使用多个线程(我希望在Python中可能)。任何其他方法都将依赖处理“S”来查找唯一的对象或进行排序,这将占用处理时间。不允许排序。@user1008636“不允许”是什么意思?是的,我的意思是不允许。sorted
不会对原始列表进行排序,如果您担心的话S
和T
仍然相同。不允许排序。itertools呢?太慢了?是的,你正在检查每个置换与S的所有成员。所以这是K*N,其中K是T的置换数。这仍然是O(N*K),其中N是S的大小,K是T的大小。如果S足够大,它就慢了
import collections
T = collections.Counter([2,3,1])
any(T == collections.Counter(x) for x in S)