0

很抱歉标题中的描述不好。

考虑一个二维列表,如下所示:

list = [
    [1, 2],
    [2, 3],
    [3, 4]
]

如果我要提取此列表的所有可能的“垂直”组合,总共有 2*2*2=8 个组合,它们将是以下序列:

1, 2, 3
2, 2, 3
1, 3, 3
2, 3, 3
1, 2, 4
2, 2, 4
1, 3, 4
2, 3, 4

现在,假设我删除了其中一些序列。假设我只想保留位置 #1 中的数字 2 或位置 #3 中的数字 4 的序列。然后我会留下这些序列:

2, 2, 3
2, 3, 3
1, 2, 4
2, 2, 4
1, 3, 4
2, 3, 4

问题

我想将这些剩余的序列重新组合成尽可能少的二维列表,这些列表需要包含所有序列,但不多也不少。

通过这样做,此特定示例中生成的二维列表将是:

list_1 = [
    [2],
    [2, 3],
    [3, 4]
]
list_2 = [
    [1],
    [2, 3],
    [4] 
]

在这种特殊情况下,可以考虑生成的列表。但是,如果有数千个序列产生数百个二维列表,我该怎么办?两周来我一直在尝试提出一个好的算法,但我离令人满意的结果还差得很远。

4

1 回答 1

0

分而治之,或分而治之。如果我们有一个逻辑表达式,说明位置 x 的值应该是 a 或位置 y 的值应该是 b,那么我们有 3 种情况:

  1. a 是位置 x 的值,b 是位置 y 的值
  2. a 是位置 x 的值,b 不是位置 y 的值
  3. a 不是位置 x 的值,b 是位置 y 的值

因此,首先您生成所有场景,您现在知道您有 3 个场景。

然后,您有效地分离您的案件并在一个子程序中处理所有案件,因为它们是您的主要任务。divide et imera 背后的哲学是将你的复杂问题简化为几个相似但不太复杂的问题,直到你达到微不足道的程度。

于 2013-11-10T23:39:41.410 回答