遍歷組合的實現 VB2005

2021-09-22 09:08:03 字數 3357 閱讀 7720

在數學的統計分支裡,排列與組合是乙個很重要的分支。在各種實際應用中,排列與組合也扮演了重要的角色。舉例來說,安排人員參加活動可以看作是組合的應用。比方說,現在有十個人,選出其中的五個人參加某項集體活動。由於彼此之間有著脾氣性格等因素,所以,不同的人員組合有著不同的工作效率。現在,要求你找出效率最高的人員安排。因為選出五人參加活動,沒有順序問題,因此是乙個組合的問題。如果說,隨機的選出乙個組合,用計算機來實現是非常簡單的,常見的"洗牌演算法"就能實現。要找出效率最高的組合,只要遍歷所有的組合即可。問題是如何遍歷所有的組合。

還是利用數學知識,我們知道組合函式c(m,n)代表著從n個人選m個人的組合的可能數。那麼c(5,10)=252就表示本題有252種選擇。如果,給每一種組合都標上標號,不同的標號代表不同的組合,這樣遍歷所有的組合就轉化為遍歷標號了。

基於這個思想,完成下面的**。其中,主函式有兩個。

乙個是

public shared function c(byval c1 as integer, byval c2 as integer) as integer

用來計算組合數的,c1是上標,c2是下標。

另乙個是

public shared function getcombination( byval lower as integer, byval upper as integer, byval count as integer, byval index as integer) as integer()

這是根據引數返回乙個組合,

lower表示返回組合的下限

upper表示返回組合的上限

count表示組合中的元素數

index表示該組合的標號

要獲得乙個組合,直接呼叫即可。如:

dim t() as integer

t= getcombination(1,10,5,20)

這個表示返回本題的乙個組合,其中20是標號

如果想隨機得到乙個組合,只要給乙個隨機的標號即可

要遍歷組合,設定引數i即可。如:

dim t() as integer,i as integer

for i=1 to c(5,10)

t=getcombination(1,10,5,i)

dosomework 

執行根據組合計算效率的**

next

這樣,就遍歷了所有的組合

**賦予其後,用的是vb2005(**格式修正於2023年1月5日) 

public

class clscombination

public

shared

function getcombination(

byval lower 

asinteger, 

byval upper 

asinteger, 

byval count 

asinteger, 

byval index 

asinteger) 

asinteger()

if count > upper - lower + 1 

then

return

nothing

if count <= 0 

then

return

nothing

if lower > upper 

then

return

nothing

if lower < 0 

orelse upper < 0 

then

return

nothing

dim ts() 

asstring = getc(lower, upper, count, index).split(

",".tochararray, stringsplitoptions.removeemptyentries)

dim ti() 

asinteger

redim ti(ts.getupperbound(0))

dim i 

asinteger

for i = 0 

to ti.getupperbound(0)

ti(i) = ts(i)

next

return ti

endfunction

private

shared

function getc(

byval lower 

asinteger, 

byval upper 

asinteger, 

byval count 

asinteger, 

byval index 

asinteger) 

asstring

dim i 

asinteger, ts 

asstring

if count = upper - lower + 1 

then

ts = 

""for i = lower 

to upper

ts &= i & 

","next

return ts

endif    index = index 

mod c(count, upper - lower + 1)

i = c(count - 1, upper - lower)

if index < i 

then

ts = lower & 

"," & getc(lower + 1, upper, count - 1, index)

else

ts = getc(lower + 1, upper, count, index - i)

endifreturn ts

endfunction

public

shared

function c(

byval c1 

asinteger, 

byval c2 

asinteger) 

asinteger

if c1 < 0 

orelse c1 > c2 

orelse c2 <= 0 

then

return 0

if c1 = 0 

then

return 1

dim i 

asinteger, s1 

assingle = 1

for i = 1 

to c1

s1 *= (c2 - i + 1) / i

next

return s1

endfunction

endclass

遍歷組合的實現 VB2005

在數學的統計分支裡,排列與組合是乙個很重要的分支。在各種實際應用中,排列與組合也扮演了重要的角色。舉例來說,安排人員參加活動可以看作是組合的應用。比方說,現在有十個人,選出其中的五個人參加某項集體活動。由於彼此之間有著脾氣性格等因素,所以,不同的人員組合有著不同的工作效率。現在,要求你找出效率最高的...

遍歷組合的實現 VB2005

在數學的統計分支裡,排列與組合是乙個很重要的分支。在各種實際應用中,排列與組合也扮演了重要的角色。舉例來說,安排人員參加活動可以看作是組合的應用。比方說,現在有十個人,選出其中的五個人參加某項集體活動。由於彼此之間有著脾氣性格等因素,所以,不同的人員組合有著不同的工作效率。現在,要求你找出效率最高的...

隨機雜湊的實現(VB2005)

編寫過程式的人都知道,隨機雜湊是我們經常要實現的問題。什麼是隨機雜湊?比方說,現在有乙個數列1 2 3 4 5 6。我希望得到乙個隨機的打亂順序的數列,例如 2,5,6,3,4,1。這個新的數列就是原數列的隨機雜湊。實際情況中,我們經常需要給定乙個範圍,就能得到乙個隨機雜湊。比方說 給定 2,7 通...