Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用动态规划法划分列表_Python_Algorithm_Partitioning_Dynamic Programming - Fatal编程技术网

Python 用动态规划法划分列表

Python 用动态规划法划分列表,python,algorithm,partitioning,dynamic-programming,Python,Algorithm,Partitioning,Dynamic Programming,我在这里发布了一些关于我一直在努力工作的项目的信息,我不断遇到设计问题,必须从头开始设计。所以我想知道我是否可以发布我正在尝试做的事情,有人可以帮助我理解如何才能得到我想要的结果 背景: 我对编程还不熟悉,我正在努力学习。所以我做了一个让我感兴趣的项目,这个项目基本上包括从列表中提取数字,然后只使用列表中的数字来分解每个数字。我知道我可以很容易地强迫它(我做到了),但我还想学习Hbase、Hadoop和并行处理,所以我想以一种可以在不同机器上中断进程的方式来完成它。我认为这样做的方法是使用动态编

我在这里发布了一些关于我一直在努力工作的项目的信息,我不断遇到设计问题,必须从头开始设计。所以我想知道我是否可以发布我正在尝试做的事情,有人可以帮助我理解如何才能得到我想要的结果

背景:

我对编程还不熟悉,我正在努力学习。所以我做了一个让我感兴趣的项目,这个项目基本上包括从列表中提取数字,然后只使用列表中的数字来分解每个数字。我知道我可以很容易地强迫它(我做到了),但我还想学习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集群

我创建的代码是为了让它工作,但问题是如何纠正设计问题。我得到的建议是,这是一个分区问题,环顾四周,发现了我试图做的()的更简单的版本,但这并不完全是我试图做的,因为它分解了一个数字,并且不使用特定的数据集来做这件事

问题:

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


希望有人能给我一些见解,但不管怎样,谢谢你阅读这篇文章。

你必须意识到,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。请注意,第一步只创建不同的可能和,但并不关心这个和的值。哦,好吧,那么我的理解正确吗