Joseph 約瑟夫環 線性複雜度

2021-08-29 13:20:07 字數 956 閱讀 4767

說有n個要被處決的人(編號0~(n-1)),從0開始報數,報到(m-1)的會被殺掉,剩下的人繼續從0開始報數,如此下去最後剩的乙個人會存活下來。說joseph發現了這個規律而且把他透露了出來,現在假如你在這n個人裡面,你會選擇幾號位置站下。

很顯然你會選擇能活下來的那個位置,所以問題就是如何得到這個位置。

首先想到的是模擬(至少我笨腦子是這麼想的),但無論是用鍊錶還是用陣列這個時間複雜度都是比較高的,至少交題的時候會tle,這裡介紹一種線性時間的解法,出自大師knuth的哦。

考慮下第一次殺人的時候,編號為k = (m - 1) % n的同學掛了,那我們從k + 1重新從0開始編號

k + 1 ==> 0

k + 2 ==> 1

…………

k - 2 ==> n - 2

k - 1 ==> n - 1

好了,剩餘的n - 1個同學又組成了乙個新的joseph環,對新環來說,編號k = (m - 1) % (n - 1)的同學會掛,如此下去,這裡面似乎有某種規律可尋。

考慮到不會死的同學一直不會被殺(廢話),我們設i個同學時的不會掛的同學的編號(即解)為x,那麼當死掉乙個同學剩餘i - 1個同學的時候,x仍然不會被殺,但此時的x已經由編號變換變成了x』,即x』是i - 1的情況時的解!一直推下去直到i - (i - 1)即1的情況,那1的時候解明顯是0嘛!(注意編號是從0開始的),倒推回來,那問題不就解決了麼!

好了,分析清楚了剩下的就只是數學推導了,這個我比較煩,直接給公式吧:

向下變換:x』 = (x - (k + 1)) % i;

向上變換:x = (x' + k + 1) % i;

其中:  k = (m - 1) % i;

帶入可得:x = (x』 + m) % i;

令f[i]表示i個人玩遊戲報m退出,最後勝利者的編號自然是f[n],遞推公式:

f[1]=0;

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

約瑟夫環(線性列表的思想)

using system using system.collections.generic using system.windows.forms namespace 約瑟夫環 所有人n圍成一圈 順時針報數,每次報到q的人將被殺掉 被殺掉的人將從房間內被移走 然後從被殺掉的下乙個人重新報數,繼續報q,...

線性篩選時間複雜度

今天可愛的mayuyu帶大家來學習線性篩選,以及分析它的時間複雜度。首先,我們學過素數篩選,它也叫線性篩選,因為對於每乙個數,我們只需要把它的倍數篩去就行了,這樣以及篩出 的就不再繼續判斷,mayuyu寫的的素數篩選 如下 void isprime cnt 0 memset prime,true,s...

複雜度分析 時間複雜度 空間複雜度

執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...