約瑟夫問題

2021-09-06 05:25:06 字數 1129 閱讀 7544

問題提出:

n個人(編號1~n)圍成乙個圈,從1開始依次報數,報到m的出列,剩下的人繼續從1開始報數(由剛出列的人的下乙個人開始)。求最後出列的人(勝利者)的編號。

為了討論方便,先把問題稍微改變一下,並不影響原意:

問題描述:

n個人(編號

0~(n-1)),從0

開始報數,報到

(m-1)

的退出,剩下的人繼續從

0開始報數。求勝利者的編號。

我們知道第乙個人

(編號一定是

m%n-1) 

出列之後,剩下的

n-1個人組成了乙個新的約瑟夫環(以編號為

k=m%n

的人開始)

:k   k+1   k+2   ... n-2, n-1, 0, 1, 2, ... k-2,

並且從k

開始報0。

現在我們把他們的編號做一下轉換:

k     --> 0

k+1 --> 1

k+2 --> 2

...k-2 --> n-2

變換後就成為了

(n-1)

個人報數的子問題,假如這個子問題的解:

x是勝利者,那麼根據上表尋找

x對應的值,這個值就是

n個人時的解。變回去的公式:

x'=(x+k)%n=(x+m)%n.

如何知道

(n-1)

個人報數的問題的解?對,只要知道

(n-2)

個人的解就行了。

(n-2)

個人的解呢?當然是先求

(n-3)

的情況---- 

這顯然就是乙個倒推問題。

令f[i]表示i

個人玩遊戲報

m退出最後勝利者的編號,最後的結果自然是

f[n]

遞推公式

f[1]=0;

f[i]=(f[i-1]+m)%i;   (i>1)

有了這個公式,我們要做的就是從

1至n順序算出

f[i]

的數值,最後結果是

f[n]

。因為實際生活中編號總是從

1開始,我們輸出

f[n]+1

這個演算法的時間複雜度為o(n)。

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...

約瑟夫問題

這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...