[英]How to calculate how many bit sequences of size n with k bits set and c changes of bit values exist?
我們知道,計算設置了k個位的n個長度位序列的數量等於C(n,k)= n!/(k! (nk)!)*。
但是我最近問自己,一旦設置了其他條件,您將如何考慮這個問題:位值的數量發生變化。 例如,對於n = 4和k = 2,我們有6個解:
1-0011
2-0101
3-0110
4-1001
5-1010
6-1100
現在假設我們只想獲得位值有兩個變化的序列。 現在只有兩種解決方案:
1-0110(從0開始,更改為1,然后再更改為0)。 2-1001(從1開始,更改為0,然后再更改為1)。
如何快速計算解決方案的數量(不生成每個組合並進行計數)? 我認為可以將初始位算作更改而不會過多改變答案,因此可以隨意進行。
額外的問題:給定組合的k位和c個位數的變化的組合,以相同的k位集合和c個位數的變化的相同數量生成下一個組合的最快方法是什么?
這是一個骨灰級的問題。 首先從一個0
s和1
s交替的順序開始,然后進行所需的位數更改,然后將其余的0
s和1
s放入骨灰盒。
示例: n=20
, k=8
, c=4
。
考慮bistring以0
開頭的情況。 從(c+1)
交替位開始,進行c
更改:
01010
此時,您仍然需要放置9 0
s和6 1
s。 讓我們先放置0
s。 在不增加任何位更改的情況下,我們可以通過多少種方式放置剩余的9個0
? 有3個“ ur”放置“球”( 0
s):
0 ... 1 0 ... 1 0 ...
^ ^ ^
(9+3-1) choose 3
種方式將9個球放入3個骨灰盒中。
一旦放置了0
s,我們還需要放置1
s。 通過類似的推理,我們在2個骨灰盒中放置了6個球( 1
s),可以用(6+2-1) choose 2
種方式來完成。
由於0
s和1
s的排列是獨立的,因此我們將結果相乘:對於長度為20的位串,有((9+3-1) choose 3) * ((6+2-1) choose 2)
種方式假設您從0
開始,則 8 1
s具有4位更改。
您仍然需要添加剩余的大小寫(從1
開始,因此第一步的結果是10101
),可以用完全相同的方法來解決。
假設我們有一排n
無法區分的物體,例如紅球。 我們可以通過幾種方式將它們分為k
非空組? 那很容易,對吧? 第一組從第一個對象開始,其他每個組都必須從某個不同的對象開始。 因此,我們可以通過選擇第一個對象和剩余的n-1
對象中的k-1
來構造一個分區,我們可以用C(n-1, k-1)
種不同的方式來完成。
現在假設我們有另一排m
無法區分的對象,例如藍色球,並且我們想將它們分為j
組。 但這是完全相同的問題,解決方案必須是C(m-1, j-1)
。
好的,現在假設我們要構造一行對象,其中n
是紅色, m
是藍色,其中共有c
組在紅色和藍色之間交替。 現在,有兩種可能性:
該行將從一個紅色的球開始。 如果c
為偶數,則將有c/2
紅色組與c/2
藍色組交錯。 如果c
為奇數,則紅色組比藍色組多,因此將有ceil(c/2)
紅色組和floor(c/2)
藍色組。 (如果c
偶數,那么floor(c/2)
和ceil(c/2)
都恰好是c/2
因此,在兩種情況下我們都可以使用floor和ceil公式。)
無論如何,我們可以將紅色的球分成幾組,將藍色的球分成幾組,然后對它們進行交織。 因此,存在C(n - 1, ceil(c/2) - 1) × C(m - 1, floor(c/2) - 1)
可能的排列。
該行將從一個藍色的球開始。 完全相同的分析適用,只是n
和m
反。
因此,安排的總數為:
C(n - 1, ceil(c/2) - 1) × C(m - 1, floor(c/2) - 1) +
C(n - 1, floor(c/2) - 1) × C(m - 1, ceil(c/2) - 1)
這只是對您的問題的重寫,該問題具有k
1和nk
零,具有c-1
轉換(導致c
組)。 我將剩下的代數步驟留給讀者(以及簡化奇數組計數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.