約瑟夫環學習小記

2021-06-12 05:07:43 字數 1088 閱讀 5883

poj 1012 - 書山有路,學海無涯 -

約瑟夫環是乙個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。

在不改變原意的情況下改變描述:

n個人(編號0~(n-1)),從0開始報數,報到m-1的退出,

剩下的人繼續從0開始報數。求勝利者的編號。

o(n)演算法:

我們知道第乙個人(編號一定是(m-1)%n) 出列之後,剩下的n-1個人組成了乙個新的約瑟夫環(以編號為k=m%n的人開始)。

假如我們知道這個子問題的解:例如x是最終的勝利者,那麼根據上面這個表把這個x變回去剛好就是n個人情況的解。

∵ k=m%n;

∴ x' = x+k = x+ m%n ; 而 x+ m%n 可能大於n

∴x'= (x+ m%n)%n = (x+m)%n

得到 x『=(x+m)%n。

嚴謹推導後得出遞推公式:第i

輪出局的人為

f(i)=(f(i-1)+m-1)%(n-i+1),f(0)=0; f(i) 表示當前子串行中要退出的那個人(當前序列編號為

0~(n-i));

拿個例子說:k=4,m=30;

f(0)=0;

f(1)=(f(0)+30-1)%8=5; 序列(

0,1,2,3,4,5,6,7

)中的5

f(2)=(f(1)+30-1)%7=6; 序列(

0,1,2,3,4,6,7

)中的7

f(3)=(f(2)+30-1)%6=5; 序列(

0,1,2,3,4,6

)中的6

f(4)=(f(3)+30-1)%5=4; 序列(

0,1,2,3,4

)中的4

每隔一人退出的特殊情況

在這種特殊情況下,演算法的時間複雜度可以大大簡化。

理論參見《具體數學》7-14頁

**參見: 的e題

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

Josephu 約瑟夫 約瑟夫環 問題

version 2019年08月08日 public class josepfu 建立乙個環形的單向鍊錶 class circlesinglelinkedlist 輔助指標,幫助構建環形鍊錶 boy curboy null for int i 1 i nums i else 遍歷當前的環形鍊錶 pu...