繁体   English   中英

检查集合/列表中至少一个元素是否在列表/集合集合中的每个元素中的最快方法

[英]fastest way to check if atleast one element in set/list is in each element in a collection of lists/sets

我有以下内容:

list1 = {"a", "b", "c"}

list2 = [
    {"a", "s", "d", "f"},
    {"q", "w", "e", "c"},
    {"v", "b", "n", "m"},
]

我现在想检查 list1 中的元素是否在 list2 中的某个位置。 list2 中的每个元素必须包含 list1 中的一个元素。

我目前所做的是以下内容(前一段时间也在 stackoverflow 上找到了它):

all(list1 & l for l in list2)

这实际上相当快。 但是我现在遇到了一个问题,我有数十亿个不同的 list1,所以我必须想出一个更快的解决方案。 我也尝试过 numba,但我在嵌套列表中苦苦挣扎,并且不支持集合。

我有一堆可以代表该集合的项目(如 list2 中的集合)。 例如,list2 中的第一个集合由“a”、“s”、“d”和“f”组成。 所有这些字符都“描述”了 list2 中的第一组。

我现在要做的是找到描述 list2 的最短组合。 例如:

list2 = [
    {"a", "s", "d", "f"},
    {"q", "w", "e", "c"},
    {"v", "b", "n", "m"},
    {"v", "l", "p", "o"},
]

这里描述 list2 的最短组合是 a、q、v(a 描述第一个元素,q 描述第二个元素,v 描述元素 3 和 4)

我构造 list1 的方式是

U = set.union(*list2)

for list1 in itertools.combinations(U,3): #i loop over the combinations to find the minimum one, so combinations(U,2), combinations(U,3) ....
     ...

这非常有效,即使对于非常大的数字(数以百万计的组合)也是如此,但它仍然有些有限。 我想尽可能地减少它。 编辑:list2 的数据结构如上所述,是一组包含字符串的集合(在我的例子中是 3 个字符的组合),因此 list1 也是一组字符串。

谢谢

您可以进行一个简单的优化,

not any(map(list1.isdisjoint, list2))

isdisjoint避免了计算完整结果的需要,并且map在您仅调用单个方法时比理解更快。

但是,如果您想要更优的结果,则必须提供有关您尝试执行的操作的更多详细信息。 特别是,所有数据结构的大小是多少,它们包含哪些元素?

我现在要做的是找到描述 list2 的最短组合

这是Hitting Set Problem ,它得到了很好的研究,并且存在多个求解器,例如这个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM