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...