根据列表列表检查列表中组合的存在

时间:2018-05-07 04:17:24

标签: 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的大小和{{1}的每个元素的长度,这似乎非常慢变大了。

4 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

您可以使用sorted

>>> S = [[1,2,3],[3,4,5],[5,6,7]]
>>> T = [2,3,1]
>>> any(sorted(T) == sorted(x) for x in S)
True

答案 2 :(得分:0)

收藏和反击?它将在O(n)中运行,而排序将大致以O(n log n)运行,原始比较将为O(n²)

{{1}}

答案 3 :(得分:0)

如果规定没有排序,您可能需要查看组合的与顺序无关的哈希函数。我喜欢的两个起点是(1)组合中各个元素的哈希值的总和,以及(2)元组(sum(combination), product(combination))