繁体   English   中英

计算分区数量的算法?

[英]Algorithm to count the number of partitionings?

最近,我遇到了将不同宽度尺寸的小容器水平均匀分散到巨大宽度尺寸的容器中的问题。 有数百万个巨大的容器,有数十亿个小容器。 我需要想出一个算法。 我将问题简化为以下问题:

我们以Process(Number,Parts)为例:

数字4可以通过 3 种方式(不包括 0)分成2部分。 Process(4,2)=3

1 + 3
3 + 1
2 + 2

同样,数字4可以通过 2 种方式分成3部分Process(4,3)=2

1 + 1 + 2
2 + 1 + 1
1 + 2 + 1

显然Process(4,4)=1

(不包括Process(4,1)=1 ,因为它是4+0 ,其中0不应该被考虑)

我想知道有没有办法计算

SuperProcess(4)=Process(4,2)+Process(4,3)+Process(4,4)=7

时间复杂度更小? 或者换句话说,更快!

尤其是请求计算的时候: SuperProcess(1209)

是否有一些数学方法而不是粗略的循环来执行此计算?

SuperProcess(n)被称为 整数的组合数,而不是分区数,其中包含相同加数的和被认为是相同的,与排序无关。

正整数n正好有2**(n-1)-1组合,不包括只有一个加数的总和。

因此,计算SuperProcess(n)的最佳算法是简单地计算表达式2**(n-1)-1 ,这可以在Theta(n)时间内完成。

如果你想枚举所有的组合,这可以通过递归函数来完成,它对和中当前位置的整数m取每个值1...n ,然后用nm递归调用自身作为下一个位置,停止在0争论。

枚举算法将花费Theta(n 2**n)时间,这是最佳的,因为这是显式保存/打印所有组合所需的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM