可快速理解的約瑟夫環的推導

2021-10-05 06:45:24 字數 2275 閱讀 5113

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

前幾天,在一篇文章中得知了約瑟夫環的問題。然後,就涉及了解決辦法。這個問題,在許多計算機或者關於資料結構的書中都有提及,而其中的解決辦法便是使用迴圈鍊錶——無論這個迴圈鍊錶是使用指標還是陣列實現,模擬約瑟夫環的進行,最後得到解決方案。具體方法肯定早有某人披露。但是,令人深感奇妙的還是這個問題的數學解決。在不統計解決過程,即不統計每次都需要出列哪個序號時,就可以應用數學遞推公式,直接得出最後剩下的那個人的序號。

使用數學方式,奇妙是很奇妙,也確實讓人感受到數學的魅力。可是,在我查詢如何推導出這個公式的時候,網上的解決方案都是在我覺得很關鍵的地方一筆帶過。「眾所周知」,「顯而易見」,「很簡單的」……諸如此類。我悲劇的鬱悶了。所以在大家都陶醉在「數學真奇妙啊」的飄飄然中時,我惴惴不安。因為我只感受到了數學帶給我的困惑。

對著網上的推導思考良久,終於茅塞頓開。所以趕緊寫下來,以防以後再次悲劇和鬱悶。並且希望以後看到這篇文章的人,能和我一樣擺脫困惑。

先總結一下約瑟夫環的遞推公式:

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

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

p(1, m, k)=1 (i = 1);   p(i, m, k)=[p(i - 1, m, k ) + m - 1] % i + 1 (i > 1, 此處先減1是為了讓模i的值不為0)

那麼這三個公式有什麼不同?

首先可以肯定的是這三個公式都正確。公式1,得到的是以0~n-1標註的最終序號;公式2,3得到的就是正常的1~n的序號;並且公式2和公式3其實是乙個意思。下面我們就分別推導三個公式,並且推導的過程中,你也就能明白這三個公式的共同點和不同點。

公式1的推導:——————————

給出乙個序列,從0~n-1編號。其中,k代表出列的序號的下乙個,即k-1出列。

a0, 1, …, k-1, k, k+1, …, n-1

那麼,出列的序號是(m-1)%n,k=m%n(這個可真的是顯而易見)。出列k-1後,序列變為

b0, 1, …, k-2, k, k+1, …, n-1

然後,我們繼續從n-1後延長這個序列,可以得到

c`0, 1, …, k-2, k, k+1, …, n-1, n, n+1, …, n+k-2

我們取從k開始直到n+k-2這段序列。其實這段序列可以看作將序列b的0~k-2段移到了b序列的後面。這樣,得到乙個新的序列

ck, k+1, …, n-1, n, n+1, …, n+k-2

好了,整個序列c都減除乙個k,得到

d0, 1, …, n-2

c序列中的n-1, n, n+1都減除個k是什麼?這個不需要關心,反正c序列是連續的,我們知道了頭和尾,就能知道d序列是什麼樣的。

這樣你看,從序列a到序列d,就是乙個n序列到n-1序列的變化,約瑟夫環可以通過遞推來獲得最終結果。ok,繼續向下。

剩下的就是根據n-1序列遞推到n序列。假設在n-1序列中,也就是序列d中,我們知道了最終剩下的乙個序號是x,那麼如果知道了x轉換到序列a中的編號x`,不就是知道了最終的結果了麼?

下面我們就開始推導出序列a中x的序號是什麼。

d->c,這個變換很容易,就是x+k;

c->b,這個變換是網上大家都一帶而過的,也是令我鬱悶的乙個關鍵點。從b->c,其實就是0~k-2這段序列轉換為n~n+k-2這段序列,那麼再翻轉回去,簡單的就是%n,即(x+k)%n。%n以後,k~n-1這段序列值不會發生變化,而n~n+k-2這段序列則變成了0~k-2;這兩段序列合起來,就是序列b。

於是乎,我們就知道了,x`=(x+k)%n。並且,k=m%n,所以x`=(x+m%n)%n=(x+m)%n。公式1就出來了:f[i]=(f[i-1]+m)%i。當然,i=1就是特殊情況了,f[1]=0。這裡還有乙個小問題。也許你會迷惑為什麼x`=(x+m%n)%n=(x+m)%n中的%n變成公式中f[i]=(f[i-1]+m)%i中的%i?其實這個稍微想想就能明了。我們%n就是為了從序列c轉換到序列b——這是在n-1序列轉換成n序列時%n;那麼從n-2轉換到n-1呢?不是要%(n-1)了嗎?所以這個值是變數,不是常量。

好了,這個最後需要注意的就是從一開始,我們將n序列從0~n-1編號,所以依據公式1得出的序號是基於0開始的。

約瑟夫環問題的理解

據說著名猶太歷史學家josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有...

關於約瑟夫環問題的理解

有序列 0,1,2,3.n 1 可以將0 n 1的序列值理解為任意陣列下標 每次刪除第m個,注意該序列首尾相連,即n 1的下乙個為0,問最後剩下的數字是多少?此問題被稱為約瑟夫環問題,可以用列舉找規律解決,但也可以使用動態規劃來思考 1 記1 n 1序列最後剩下的數字為 f n,m 其中n表示有n個...

基本約瑟夫環的一些理解

約瑟夫環 josephus cycle 編號為1,2,3,n的n個人按順時針方向圍坐一圈。任選乙個正整數作為報數上限m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數,報m的人出列。從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到最後圈中只剩下最後乙個人 勝利者 請設計程式...