【问题标题】:partition of a list using dynamic programming使用动态编程划分列表
【发布时间】:2011-10-06 07:36:37
【问题描述】:

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

背景:

我是编程新手,正在努力学习。所以我做了一个让我感兴趣的项目,它基本上涉及列出列表并仅使用列表中的数字分解每个数字。我知道我可以很容易地暴力破解(我确实这样做了),但我也想学习 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 个多月,每次遇到设计问题时,我都不得不从头开始。如何正确构建它(要查看我的错误方式,请参见上面的链接)?我在谷歌上搜索并找到了背包问题和分区问题的解决方案,但它们似乎更多地用于学校工作,而不是真正为大规模数据集而构建。

希望有人能给我一些见解,但无论如何感谢您阅读本文。

【问题讨论】:

    标签: python algorithm partitioning dynamic-programming


    【解决方案1】:

    您必须意识到,DP 问题本身对于独立和分布式计算并不是最优的。

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

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

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

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

    所以总结一下并回答你的问题:

    • 再想一想,你到底要不要把这个问题当作DP。
    • 您可能想了解数据并行性。这在使用 GPU 解决此类问题时尤其重要,因此有关 CUDA/OpenCL 的相应文献也可能有用。

    【讨论】:

    • 非常感谢您花时间回答这个问题,弗兰克。我认为动态编程基本上帮助我生成了基于预计算的表,但我想了想,也许我不需要给动态函数提供整个列表,也许我可以分解列表以便对其进行处理有点独立。例如,4 可以分解为 [2,2] 并且 2 可以是 [1,1] 但我不需要在同一个 cpu 上执行此操作,因为它们看起来是独立的。另外为了节省 cpu 时间,我没有计算整个列表,但我只考虑了下一个变量。
    • 我不完全理解你的解决方案。我见过其他人(在谈到 DP 时)也向我展示了一个 simlair 表,但是 [1,4] 是什么意思? 1可以生产4?如果是这样,它将如何使用 [1,2,4] 的列表解决 5 的数量。正确的答案应该是 [4 + 1] 但我不确定如何生成一个列表来获得该结果。跨度>
    • 在这种方法中,[1,4] 是您解决方案的一部分,因为它被读取为 1+4 组成 5。请注意,第一步只会创建不同的可能总和,但还没有关心这个总和的价值。
    • 哦,好吧,我的理解正确吗?我创建了一个包含 5 的列,然后是 [1,4] 的值等等..所以我基本上只是在我的桌子上查找 5然后得到那个值?
    • Lostsoul,别忘了接受最佳答案。我很确定@Frank 的答案会是最好的……
    猜你喜欢
    • 2014-06-22
    • 2014-04-07
    • 2017-12-29
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多