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)