0%

约瑟夫环-递推

       约瑟夫环问题:有n个人围成一个圈,标号分别为0~n-1,从第一个人开始从1进行数数,数到k的人淘汰出圈外,求最后一个被淘汰的人的编号。
       之前比较暴力的解法就是用线性结构模拟环,模拟淘汰的过程,复杂度为O(NK)
       利用递推的思想我们可以实现O(N)的复杂度。
       推理的思路如下:

       我们第一次淘汰的人的下标很容易得出,即 x1=(k-1)%n (这个式子我们可以通通过几个简单的例子得到,例如n=4,k=5;n=4,k=5;n=3,k=1;这三个例子可以验证我们得到的式子的正确性)
       那我们得到了x1,怎么计算第二次的?假设我们第一次时,k<n
则数列初始状态为0,1,2,3,4,…n-1,第一次淘汰掉k-1,则剩下0,1,2,3..k-2,k,..n-1;,我们将剩下的人重新排序,以第一次淘汰结束后的k为0,则状态变为n-k,n-k+1,n-k+2,n-k+3..n-2,0,..n-1..n-k-1;
人的标号范围变为0~n-2
       那我们在第二次的标号规则下,淘汰的人的标号为
x2=(x1+k-1)%(n-1)
       我们知道最后一次淘汰的,在最后一次的标号规则下,编号即为0
我们记f(i)为第i次淘汰的人在第i次淘汰时的编号,则f(0)=0
我们所需要做的是,通过f(i-1)推出f(i),通过上面的对照表,我们可以得到
f(i)=(f(i-1)+k)%n
应该也是可以从 x2=(x1+k-1)%(n-1) 此公式得出,但目前。。。我还不会推。
所以我们可以通过递推最终得到f(n),即最后一次被淘汰的人的编号。