約瑟夫環 問題

2021-09-30 01:50:24 字數 1015 閱讀 2177

約瑟夫環:在羅馬人占領喬塔帕特後,39 個猶太人與 josephus 及他的朋友躲到乙個洞中,39 個猶太人決定寧願死也不要被敵人抓到,於是決定了一種自殺方式,41 個人排成乙個圓圈,由第 1 個人開始報數,報數到 3 的人就自殺,然後再由下乙個人重新報 1,報數到 3 的人再自殺,這樣依次下去,直到剩下最後乙個人時,那個人可以自由選擇自己的命運。這就是著名的約瑟夫問題。現在請用單向環形鍊錶得出最終存活的人的編號。

首先設定乙個長度為n的陣列,預設初始化為false,若當前陣列中的元素的值為false,說明該元素還未被移除,若當前陣列中的元素為true,先將sum++,此時就需要對當前用於計數的sum與m值進行比較,如果sum==m,說明當前位置上的值需要被設定為true(表示該元素已被移除),並將sum重新設定為0,淘汰人數pass+1,若sum!=m,說明此時的sum還不到m,因此將i++,繼續判斷即可。若當前元素是false,說明當前元素已被移除,直接i++找後乙個即可,迴圈的退出條件是當pass淘汰的人數=總人數(pass由於在每次sum++後的值與m進行判斷,如果相同會將當前i位置上的元素設定為true,再將i++,因此當前i位置上對應最終返回的其實是i+1,這也就將陣列的下標與編號(從0開始)一一對應起來。當最後乙個元素返回時,其返回的i並不是下標,而是下標+1.也就剛好是編號的值。

/**

* created by xiaoaxiao on 2019/11/27

* description: n個人,報到m出去,最後剩下的那個人的編號(從1開始)

* 時間複雜度:o(n²) 空間複雜度:o(n)

*/public class josephring

if (!people[i])

// 無論當前位置上的人是否被淘汰,i都需要向後走一步

// 比較巧妙:如果是最後一次pass==n時,此時的i再+1,剛好對應了實際的編號(從1開始)

i++;

} else

}return i;

}}

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫環問題

約瑟夫環問題 問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...