使用动态编程对列表进行分区

时间:2011-10-06 07:36:37

标签: python algorithm partitioning dynamic-programming

我在这里发布了一些与我一直在尝试的项目相关的内容,并且我一直在设计问题并且必须从头开始设计。所以我想知道我是否可以发布我想要做的事情,有人可以帮助我理解我如何得到我想要的结果。

背景

我是编程和尝试学习的新手。所以我采取了一个让我感兴趣的项目,其中涉及基本上列表并使用列表中的数字分解每个数字。我知道我可以很容易地强行这个(我做过)但我也想学习Hbase,Hadoop和并行处理,所以我想以一种我可以在各种机器上打破这个过程的方式来做。我认为这样做的方法是使用动态编程和递归来创建一个可以进一步细分的可能性表。

示例:

如果我提交了列表:[1,2, 4]我应该{1: [[1]], 2: [[1, 1]], 4: [[2, 2]]}。它基本上说的是2 + 2 = 4,1 + 1 = 2和1 = 1.所以试图看到所有的方法4,我可以查看这个列表(将在数据库中)和看到2 + 2 = 4,然后分解2 ......依此类推..我的查找工作正在运行,但是我遇到了问题。使用暴力不会让我使用大数字(比如一百万,在列表中有一千个数字),我可以使用hadoop或其他工具来扩展它。以下是可能结果的更多示例:

[1,2, 3, 4] = {1: [[1]], 2: [[1, 1]], 3: [[1, 2]], 4: [[1, 3], [2, 2]]}
[1,2, 3, 4, 6, 10] = {1: [[1]], 2: [[1, 1]], 3: [[1, 2]], 4: [[1, 3], [2, 2]], 6: [[2, 4], [3, 3]], 10: [[4, 6], [2, 2, 2, 2, 2]]}
[10, 30, 50] = 50: [[10, 10, 30]], 30: [[10, 10, 10]]}

使用这种方法的逻辑是,计算列表中的下一个可能数据不会花费时间,因此如果我发送一个包含一百万个数字的列表,它可以快速完成,甚至可以扩展到hadoop集群。

我为使其工作而创建的代码是here,但问题是如何纠正设计问题。我得到了一个建议,这是一个分区问题,环顾四周,找到了我试图做的更简单的版本(activestate),但它不是我想要做的,因为它打破了一个数字,并且不使用特定的数据集来做到这一点。

问题:

所以希望我清楚地描述了我想要做的事情。我需要阅读/学习/学习如何使用动态编程在python中创建列表分区表,以便它可以扩展?它只是一个爱好,而不是时间敏感,但我觉得我已经工作了3个多月,每次我遇到设计问题,导致我必须从头开始。我怎样才能正确构建(看到我的错误方式看到上面的链接)?我用谷歌搜索并找到了背包问题和分区问题的解决方案,但它们似乎更适合学校工作,而不是真正用大型数据集扩展。

希望有人能给我见解,但不管你是否感谢你阅读本文。

1 个答案:

答案 0 :(得分:3)

您必须意识到,DP问题本身并不适用于独立和分布式计算。

当您考虑DP算法的经典形式时,您有一个矩阵/表/数组,并且您按照特定顺序连续计算新值。每次计算值都需要之前必须创建的其他值。因此,您将失去数据独立性,并且可以同时最大程度地计算一定数量的阵列字段,具体取决于特定的DP算法。例如,许多DP算法可以并行处理整个表列,因为每个字段都依赖于前一列的字段。但由于该列之后所有剩余字段的数据依赖性,这已经是限制。

话虽这么说,计算列表中可用的各种数字的总和可能性不是DP问题。您根本不解决任何子问题,只是收集所有可能的总和(如果它们恰好匹配您的一个列表条目)。

因此,我建议采用以下截然不同的方法:

  • 计算包含所有可能摘要的新列表。这是数据无关的并且可以并行化,但是您需要一些上限来终止。示例:[1,2,4]变为[ [1],[2],[4],[1,1],[1,2],[1,4],...]。您不必显式构造此列表,只需将每个这样的组合传递给下一步。
  • 评估每个计算,即创建总和并检查它是否与原始列表中的值匹配。同样,您是独立于数据的,可以独立执行所有这些计算。
  • 将积极结果与最终数据结构相结合。

总结并回答你的问题:

  • 反思,是否要将此问题视为DP。
  • 您可能想要了解数据并行性。这在使用GPU解决此类问题时尤为重要,因此有关CUDA / OpenCL的相应文献也可能有用。