簡體   English   中英

計算所有可能的組合

[英]Calculate all possible combinations

前言

考慮一個由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的條形圖中找到每個節奏模式,僅由八分音符的單組和雙組組成,其中可以綁在條形線上。

在這里計算可能性的數量實際上有一個非常巧妙的解決方案(在我看來)。

請注意,對於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.此外,我不清楚EEE E-是否是分開的,如果它們不是那么, C(1)是2不3.注意這些只適用於對自己的 0或1的序列,你得有一個如果實際的功能之外聲明C(n)返回1而不是2。否則它擰緊整個復發。 有點亂,但這是算法中真實世界數據的本質

這意味着你基本上有一個斐波那契系列的變種! 好吧?

數據表示

我會有一個n boolean的列表。 數組可以正常工作。 如果連接了2個音符,則數組中的該條目應為true 我將索引0作為第一和第二個音符的連接,索引n-1是最后一個音符是否連接到任何東西。

排列生成

我們計算可能性總數的方式非常適合於生成方法( G(n) )。 對於n,我們需要將EE加到G(n-2)EG(n-1)

在這種復發的基礎上,我們有:

G(0) = {E, E-} 
G(1) = {E-E, E E, E E-}

如果你讓元素間空間成為你的主要數據,那么你就有12個“空格”(最后一個是與第一個空格相關的結尾)。

每個“空間”可以是空白的或具有鏈接。 所以你可以把它表示為0或1.所以最多有2 ^ 12種可能性。 這是一個相當小的數字(4096),所以你可以生成所有這些,然后清除那些相鄰的1。

我認為變種的總數是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 +多項%%286%2C + 3%29 +%2B +多項%%284%2C + 4%29 +%2B +多項%282%2C + 5%29 +%2B +多項%286%29

通常情況下我會將此乘以2以說明結束鏈接的可能性,但實際上這可能會在某些情況下創建三個EEE鏈,這將打破您的問題。

另一方面,有一些算法可以為某些參數生成所有多項式組合,並且由於它們都是200,因此很容易生成所有這些,只需檢查哪些可以通過當時的循環鏈接進行擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM