組合數元組編號

前言:僅個人小記。

問題描述

如何遍歷nn個點中的所有44元組呢,即如何遍歷(n4)\binom{n}{4}個不同的四元組呢?舉例:n=6n=6,則所有的44元組共有(64)=15\binom{6}{4}=15個,具體爲
(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
用於對組合數進行編號,抽象地看就是希望將一個四元組映射成一個編號(a,b,c,d)is.t. a<b<c<d(a,b,c,d)\rightarrow i\\s.t.\ a<b<c<d

方案

給出映射函數p(a,b,c,d,n)=i=1a(ni3)+i=0ba2(nb+i2)+i=0cb2(nc+i1)+(dc+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)

程序實現

def combN(n,m):# 計算簡單的組合數, 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): # n 爲總體數目 p(a,b,c,d,n) 表示從 n中選出 K4= {a,b,c,d} 並映射成的單值
    # 從 n 個數中選出 K4 個數,對 K4 進行編號
    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

小結

上述只是給出了從四元組到編號的映射,而實際上顯然應該同樣存在從編號到四元組的映射,本文並沒有給出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章