计算所有可能的组合

时间:2012-11-02 04:10:03

标签: java algorithm data-structures

前言

考虑一个由无关值组成的12个元素的列表,数组或字符串(比方说E)。每个元素最多可链接到另一个相邻元素,或者如果它是列表的最后一个元素,则可以链接到第一个元素。

有效列表的示例,其中破折号表示链接,“E”表示元素。

E E E E E E E E E E E E 
E E-E E-E E E E-E E-E E
E E E-E E E-E E-E E E E-

无效列表的示例。

E-E-E E E E E-E E E E E-

问题

我想计算唯一列表的总数,然后打印出来。

要解决这个问题,表示数据的最佳方法是什么?

最好是实现特定于此问题的数据结构吗?

我希望用Java实现这一点,但如果您认为不同的语言更适合我,我愿意接受建议。

为什么

这不是一个家庭作业问题。

这个想法是在一个12/8的条形图中找到每个节奏模式,只包含单个和两个八分音符组合,其中可以绑定一个小节线。

3 个答案:

答案 0 :(得分:4)

在这里计算可能性的数量实际上有一个非常巧妙的解决方案(在我看来)。

请注意,对于n个音符,如果第一个音符连接到第二个音符,则可能的连接数(C(n))为C(n-2)。否则为C(n-1)。这意味着

C(n) = C(n-1) + C(n-2)
C(1) = 3 //Either the first and second are connected, 
         //neither are connected, or the end is connected.
C(0) = 2 //Either the end is connected or it isn't

注意:如果单个音符示例中的最后一个音符可以连接到“它自己”G(0)是1,否则,它是0.另外我不清楚是否{{1} }和E-E是分开的,如果不是,E E-是2而不是3.注意这些仅适用于0或1 的序列你自己必须在实际函数C(1)之外使用if语句返回1而不是2.否则会搞砸整个重复。有点乱,但这是算法中真实世界数据的本质

这意味着你基本上在斐波那契系列中有一个变种!好吧?

数据表示

我会有一个n C(n)的列表。数组可以正常工作。如果连接了2个音符,则数组中的该条目应为boolean。我将索引0作为第一个和第二个音符的连接,索引true是最后一个音符是否连接到任何东西。

排列生成

我们计算可能性总数的方式非常适合生成方法(n-1)。对于n,我们需要将G(n)改为E-EG(n-2)改为E

在这种复发的基础上,我们有:

G(n-1)

答案 1 :(得分:0)

如果你让元素间空间成为你的主要数据,那么你有12个“空格”(最后一个是与第一个空格相关的结尾)。

每个“空格”可以为空白或有链接。所以你可以把它表示为0或1.所以最多有2 ^ 12种可能性。这是一个相当小的数字(4096),所以你可以生成所有这些,然后清除相邻1的那些。

答案 2 :(得分:0)

我认为变种的总数是466.

可以按如下方式计算数字:

如果我们假设EE链接被标记为Y,那么例如,在12中仅有两个E被连接的排列的总数等于当第一个被重复时具有2个项目的排列的数量。重复10次,第二次重复一次。基本上这相当于以下列表:

Y E E E E E E E E E E 
E Y E E E E E E E E E
E E Y E E E E E E E E
..
E E E E E E E E E E Y

这与计算多项式(10,1)基本相同,即11(http://www.wolframalpha.com/input/?i=multinomial%2810%2C+1%29

总数是以下总和:

multinomial(12) + // there is no E-E link at all 
multinomial(12 - 2, 1) + // only one E-E link 
multinomial(12 - 4, 2) + // two E-E links
...
multinomial(12 - 12, 6)  // 6 E-E links

这是233(http://www.wolframalpha.com/input/?i=multinomial%2812%29+%2B+multinomial%2810%2C+1%29+%2B+multinomial%288%2C+2%29+%2B+multinomial%286%2C+3%29+%2B+multinomial%284%2C+4%29+%2B+multinomial%282%2C+5%29+%2B+multinomial%286%29

通常我会将此乘以2以考虑结束链接的可能性,但这实际上可以在某些情况下创建一个三个E-E-E链,这将打破您的问题。

另一方面,有一些算法可以为某些参数生成所有多项式组合,因为它们都像200那样很容易生成全部,只需检查哪些可以通过循环链接进行扩展。< / p>