前言:僅個人小記。
問題描述
如何遍歷n n n 個點中的所有4 4 4 元組呢,即如何遍歷( n 4 ) \binom{n}{4} ( 4 n ) 個不同的四元組呢?舉例:n = 6 n=6 n = 6 ,則所有的4 4 4 元組共有( 6 4 ) = 15 \binom{6}{4}=15 ( 4 6 ) = 1 5 個,具體爲
( 1 , 2 , 3 , 4 ) ( 1 , 2 , 3 , 5 ) ( 1 , 2 , 3 , 6 ) ( 1 , 2 , 4 , 5 ) ( 1 , 2 , 4 , 6 ) ( 1 , 2 , 5 , 6 ) ( 1 , 3 , 4 , 5 ) ( 1 , 3 , 4 , 6 ) ( 1 , 3 , 5 , 6 ) ( 1 , 4 , 5 , 6 ) ( 2 , 3 , 4 , 5 ) ( 2 , 3 , 4 , 6 ) ( 2 , 4 , 5 , 6 ) ( 3 , 4 , 5 , 6 ) (1,2,3,4)\\(1,2,3,5)\\(1,2,3,6)\\(1,2,4,5)\\(1,2,4,6)\\(1,2,5,6)\\(1,3,4,5)\\(1,3,4,6)\\(1,3,5,6)\\(1,4,5,6)\\(2,3,4,5)\\(2,3,4,6)\\(2,4,5,6)\\(3,4,5,6) ( 1 , 2 , 3 , 4 ) ( 1 , 2 , 3 , 5 ) ( 1 , 2 , 3 , 6 ) ( 1 , 2 , 4 , 5 ) ( 1 , 2 , 4 , 6 ) ( 1 , 2 , 5 , 6 ) ( 1 , 3 , 4 , 5 ) ( 1 , 3 , 4 , 6 ) ( 1 , 3 , 5 , 6 ) ( 1 , 4 , 5 , 6 ) ( 2 , 3 , 4 , 5 ) ( 2 , 3 , 4 , 6 ) ( 2 , 4 , 5 , 6 ) ( 3 , 4 , 5 , 6 )
現在,因爲編程需要(必須需要對這些四元組給出一個序關係,便於比較等操作),故而希望對這些四元組進行編號,使得對四元組的操作轉化爲對一元編號的操作。具體地效果希望如下
( 1 , 2 , 3 , 4 ) → 1 ( 1 , 2 , 3 , 5 ) → 2 ( 1 , 2 , 3 , 6 ) → 3 ( 1 , 2 , 4 , 5 ) → 4 ( 1 , 2 , 4 , 6 ) → 5 ( 1 , 2 , 5 , 6 ) → 6 ( 1 , 3 , 4 , 5 ) → 7 ( 1 , 3 , 4 , 6 ) → 8 ( 1 , 3 , 5 , 6 ) → 9 ( 1 , 4 , 5 , 6 ) → 10 ( 2 , 3 , 4 , 5 ) → 11 ( 2 , 3 , 4 , 6 ) → 12 ( 2 , 3 , 5 , 6 ) → 13 ( 2 , 4 , 5 , 6 ) → 14 ( 3 , 4 , 5 , 6 ) → 15 (1,2,3,4)\rightarrow1\\(1,2,3,5)\rightarrow2\\(1,2,3,6)\rightarrow3\\(1,2,4,5)\rightarrow4\\(1,2,4,6)\rightarrow5\\(1,2,5,6)\rightarrow6\\(1,3,4,5)\rightarrow7\\(1,3,4,6)\rightarrow8\\(1,3,5,6)\rightarrow9\\(1,4,5,6)\rightarrow10\\(2,3,4,5)\rightarrow11\\(2,3,4,6)\rightarrow12\\(2,3,5,6)\rightarrow13\\(2,4,5,6)\rightarrow14\\(3,4,5,6)\rightarrow15 ( 1 , 2 , 3 , 4 ) → 1 ( 1 , 2 , 3 , 5 ) → 2 ( 1 , 2 , 3 , 6 ) → 3 ( 1 , 2 , 4 , 5 ) → 4 ( 1 , 2 , 4 , 6 ) → 5 ( 1 , 2 , 5 , 6 ) → 6 ( 1 , 3 , 4 , 5 ) → 7 ( 1 , 3 , 4 , 6 ) → 8 ( 1 , 3 , 5 , 6 ) → 9 ( 1 , 4 , 5 , 6 ) → 1 0 ( 2 , 3 , 4 , 5 ) → 1 1 ( 2 , 3 , 4 , 6 ) → 1 2 ( 2 , 3 , 5 , 6 ) → 1 3 ( 2 , 4 , 5 , 6 ) → 1 4 ( 3 , 4 , 5 , 6 ) → 1 5
用於對組合數進行編號,抽象地看就是希望將一個四元組映射成一個編號( a , b , c , d ) → i s . t . a < b < c < d (a,b,c,d)\rightarrow i\\s.t.\ a<b<c<d ( a , b , c , d ) → i s . t . a < b < c < d
方案
給出映射函數p ( a , b , c , d , n ) = ∑ i = 1 a ( n − i 3 ) + ∑ i = 0 b − a − 2 ( n − b + i 2 ) + ∑ i = 0 c − b − 2 ( n − c + i 1 ) + ( d − c + 1 ) p(a,b,c,d,n)=\sum_{i=1}^{a}\binom{n-i}{3}+\sum_{i=0}^{b-a-2}\binom{n-b+i}{2}+\sum_{i=0}^{c-b-2}\binom{n-c+i}{1}+(d-c+1) p ( a , b , c , d , n ) = i = 1 ∑ a ( 3 n − i ) + i = 0 ∑ b − a − 2 ( 2 n − b + i ) + i = 0 ∑ c − b − 2 ( 1 n − c + i ) + ( d − c + 1 )
程序實現
def combN ( n, m) :
a = 1
b = 1
for i in range ( 1 , m+ 1 ) :
b *= i
a *= ( n- i+ 1 )
return a// b
def p ( a, b, c, d, n) :
index = 0
for i in range ( 1 , a+ 1 ) :
index += combN( n- i, 3 )
for i in range ( 0 , b- a- 1 ) :
index += combN( n- b+ i, 2 )
for i in range ( 0 , c- b- 1 ) :
index += combN( n- c+ i, 1 )
index += ( d- c- 1 )
return index
小結
上述只是給出了從四元組到編號的映射,而實際上顯然應該同樣存在從編號到四元組的映射,本文並沒有給出。