[英]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.此外,我不清楚EE
和E 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)
和E
到G(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
通常情況下我會將此乘以2以說明結束鏈接的可能性,但實際上這可能會在某些情況下創建三個EEE鏈,這將打破您的問題。
另一方面,有一些算法可以為某些參數生成所有多項式組合,並且由於它們都是200,因此很容易生成所有這些,只需檢查哪些可以通過當時的循環鏈接進行擴展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.