计算排列需要太多时间

时间:2018-06-28 05:50:54

标签: python performance combinations permutation factorial

我正在尝试产生20个!排列并对其执行一些逻辑运算。我切换到多处理,随着我增加与核心数量成比例的进程数量,性能也随之提高。 我已经将25秒的时间维持了10天!在32核系统上进行计算。 我的最后任务是做20个!在不到2小时的时间内,我正在考虑进行GPU编程。为我应该遵循的方法提供建议

2 个答案:

答案 0 :(得分:0)

10! = 3628800  
20! = 2432902008176640000  
20!/10! = 670442572800  

如果需要25秒才能产生10秒!排列,则需要大约670442572800次乘以25秒。这将花费531490年。请查看您的问题。

答案 1 :(得分:0)

每当我执行涉及大量置换的任何操作时,我都会考虑如何避免重新生成生成置换时已经计算出的值。一种这样的方法是使用递归。通过使用递归,您通常可以一次计算前n个可能性,然后将计算值传递给所有其他函数调用而无需重新计算n!次。然后,下一个函数调用处理n-1种可能性,依此类推。这种方法的问题在于,递归本身会给所有函数调用增加相当大的开销,并阻止编译器进行内联+应用进一步的优化。

鉴于您说您有n!排列,我假设您可能正在重新排列n个项目。如果这些排列需要一段时间才能生成每个排列(不仅仅是简单的加/乘之类的东西),您可以考虑做的一件事是(如果可能),生成所有可能的k项排列,即k! *(20选择k),仍然比20小得多!小k。然后将其存储在哈希表或排序数组之类的东西中,然后查找所有其他值(20-k)! *(20选择k)排列。如果要搜索某个最佳值,请尝试将每个查询中的值“减去”到查找表中(再次,如果可能的话),如果有条目,则将其作为最佳值。

如果没有有关该问题的更多详细信息,恐怕我没有其他建议。