所有可能的组合,将n个列表与至少每个列表的elem组合

时间:2018-06-25 12:35:33

标签: list permutation combinatorics

输入n个列表,每个列表可能包含n个元素。我想找到每个输入列表至少包含一个元素的所有组合。 2个长度为2的输入列表的示例

input 1: {1,2}
input 2: {3,4}

expected result: 
{{1,3}, {1,4}, {2,3}, {2,4}, {1,2,3}, {1,2,4}, {1,3,4}, {2,3,4}, {1,2,3,4}}

可扩展到具有n个元素的n个输入列表

1 个答案:

答案 0 :(得分:0)

基本上,您可以将二进制数从1计数到2^n - 1。每一套。 然后,为每组选择一个数字,以提供(2^n - 1)^n个组合。 二进制数字告诉您要包​​括(1)哪些元素(0)。

在上面的示例中(假设{1, 2, 3, 4}确实是预期结果的一部分),您将拥有9 = 3^2 = (2^2 - 1)^2个组合。


因为答案解释不充分,所以请进一步解释。

让我坚持您的榜样。我们有

  • 1 = 01b->对于set1为{2},对于set2为{4}
  • 2 = 10b->对于set1为{1},对于set2为{3}
  • 3 = 11b->对于set1,{1,2},对于set2,{3,4}

由于省略了0 = 00b,因此可以确保从每个集合中至少选择一个元素。

现在,我们为每组选择一个数字。这样

(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2)和(3,3)。

如果用第一个集合中的相应元素集替换第一个数字,并用第二个集合中的对应元素替换第二个数字,则将获得所需的结果:

  • (1,1)-> {2,4}
  • (1,2)-> {2,3}
  • (1,3)-> {2,3,4}
  • (2,1)-> {1,4}
  • (2,2)-> {1,3}
  • (2,3)-> {1,3,4}
  • (3,1)-> {1,2,4}
  • (3,2)-> {1,2,3}
  • (3,3)-> {1,2,3,4}

基本上,您只是在2 ^ n-1个数字系统中进行计数。该数字的范围是0到2 ^ n-2。所以我们有00、01、02、10、11、12、20、21、22,它们与上面的列表完全对应,只是数字比1小1它们对应的数字。