假設我有一個排序數組,N,包含n元素。現在,由於k,我需要一個高效的方法來生成中間組合的k-組合(如果所有的組合都按字典順序排序)。查找n個排序元素的中間k組合的高效方法
實施例:
N = {a,b,c,d,e} , k = 3
1:a,b,c
2:a,b,d
3:a,b,e
4:a,c,d
5:a,c,e
6:a,d,e
7:b,c,d
8:b,c,e
9:b,d,e
10:c,d,e
我需要的算法來生成組合編號5。
的組合數系統上的維基百科頁面說明如何可獲得這種(以貪婪的方式)。然而,因爲n非常大,我需要找到所有的中間組合k的小於n,我需要比這更有效的東西。
我希望既然感興趣的組合總是在中間,那麼找到它就有一種直接的方法。例如,上面列表中的第一個K組合總是由N中的第一個元素給出,並且類似地最後的組合總是由最後的元素給出。有沒有這種方式來找到中間組合?
http://en.wikipedia.org/wiki/Combinatorial_number_system
n和k有多大? –
n的數量級爲10^5,但是我需要遍歷所有小於n的k。所以當k = n/2時,可能的連擊數量會非常大。 – sasan
因此,50,000選擇25,000產生一個大約15,050位數字的數字。見http://www.ohrt.com/odds/binomial.php。你可能試着做的是預先計算你正在尋找的值到某個點,然後想出一個函數來估計它們的值。你仍然可以使用我的課程中的一些。但是,我懷疑你應該做的就是重新思考問題並將其分解,以便更容易解決。 –