将列表组合到尽可能少的二维列表中

时间:2013-11-10 22:23:55

标签: algorithm language-agnostic

对于标题中的错误描述感到抱歉。

考虑一个二维列表,例如:

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] 
]

在这种特殊情况下,可以考虑结果列表。但是,如果有成千上万的序列产生二维列表,我该怎么办呢?我一直试图提出一个好的算法两个星期了,但我无法获得令人满意的结果。

1 个答案:

答案 0 :(得分:0)

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

  1. a是位置x处的值,b是位置y处的值
  2. a是位置x处的值,b是位置y处的值
  3. a不是位置x的值,b是位置y的值
  4. 所以,首先你生成所有场景,现在你知道你有3个场景。

    然后,您有效地分离您的案例并在子例程中处理所有案例,因为它们是您的主要任务。除了et imera之外的哲学是将你的复杂问题简化为几个相似但不那么复杂的问题,直到你达到琐碎的程度。