在實際的程式設計中,有時會需要遍歷一組數字的全排列,來獲得計算的結果。這在解某些最優解的題目的時候,特別有用。
例如:現在有4個人去完成4項任務,每人只能完成一項任務,每人完成各個任務的效率都不同。那如何安排才能使得總效率最高?這是乙個任務指派的問題,我們可以使用匈牙利法解決,這不是本篇文章的討論重點,有興趣的讀者可以參看有關文章。如果,我們遍歷1-4的全排列,分別求出每種全排列的效率和,然後取最大的一組解。這也是解題的一種思路。
換乙個思路,以上題為例,學過排列組合的都知道,全排列的可能性一共有4!=4×3×2×1=24種可能。我能不能給定乙個引數就能獲得乙個全排列呢?比方說,給定13得到乙個全排列,給定7得到另乙個全排列。這樣,只要遍歷引數從1到24就能得到所有的全排列。
下面給出這個思路的程式**,用的是vb2005
'函式名:getrandomlist
'作用:獲得乙個全排列的雜湊
'引數value:指定全排列的引數標號
'引數count:全排列中數字的個數
public function getrandomlist( _
byval value as integer, _
byval count as integer _
) as integer()
dim mbase() as integer, mn as integer
dim i as integer, j as integer
if count <= 0 then return nothing
mn = n(count)
if value > mn - 1 orelse value < 0 then value = value mod mn
redim mbase(count - 1)
for i = 0 to count - 1
mbase(i) = i + 1
next
for i = count to 2 step -1
mn = mn / i
j = int(value / mn)
call swapnumber(mbase(j), mbase(i - 1))
value = value mod mn
next
return mbase
end function
隨機雜湊的實現(VB2005)
編寫過程式的人都知道,隨機雜湊是我們經常要實現的問題。什麼是隨機雜湊?比方說,現在有乙個數列1 2 3 4 5 6。我希望得到乙個隨機的打亂順序的數列,例如 2,5,6,3,4,1。這個新的數列就是原數列的隨機雜湊。實際情況中,我們經常需要給定乙個範圍,就能得到乙個隨機雜湊。比方說 給定 2,7 通...
全排列的實現
在c 的模板中,有一對專門用於實現數字或字元全排列的模板 next permutation biter,biter 和prev permutation biter,biter 前者實現向後排列,後者實現向前排列,即前者在原順序上依次產生較大的排列,後者則相反。舉個例子 假設需要產生以 354 為基礎...
全排列的實現
程式設計思路如下 擷取自 erlang程式設計 3.8 除錯的 include include include using namespace std void insert string str,char ch,vector aa void fun string array,vector a st...