介绍
在尝试对图中的节点进行一些分类(将呈现不同)时,我发现自己面临以下问题:
问题
给定一个元素的超集及其S = {0, 1, ... M}
许多不相交的子集,其中,找出集合的划分的最佳算法是什么?n
T_i
0 <= i < n
S
P
P = S
是原始超集的所有不相交分区的并集,其中,对于所有元素,每个“原始”集合中的“父”列表都相同。P_j
S
0 <= j < M
x in P_j
x
T_i
例子
S = [1, 2, 3, 4, 5, 6, 8, 9]
T_1 = [1, 4]
T_2 = [2, 3]
T_3 = [1, 3, 4]
所以所有P_j
的 s 都是:
P_1 = [1, 4] # all elements x have the same list of "parents": T_1, T_3
P_2 = [2] # all elements x have the same list of "parents": T_2
P_3 = [3] # all elements x have the same list of "parents": T_2, T_3
P_4 = [5, 6, 8, 9] # all elements x have the same list of "parents": S (so they're not in any of the P_j
问题
- python 包中有哪些好的函数/类来计算所有
P_j
s及其“父母”列表,理想情况下仅限于numpy
andscipy
?也许已经有一个功能可以做到这一点 - 找到这些分区以及每个分区
P_j
的“父母”列表的最佳算法是什么?让我们注意T_0 = S
我认为蛮力方法是生成所有 2 个集合的组合T
并将它们分成最多 3 个不相交的集合,这些集合将被添加回T
集合池,然后重复该过程直到所有结果T
s 不相交,因此我们已经得到了我们的答案——P
集合。一个小问题可能是在途中缓存所有“父母”。
我怀疑可以使用动态编程方法来优化算法。
注意:我很想用乳胶(通过MathJax)编写数学部分,但不幸的是这没有被激活:-(