约瑟夫环问题

来源:互联网 发布:淘宝网男装毛衫 编辑:程序博客网 时间:2024/04/30 02:44

           这部分是我理解约瑟夫环问题。

           约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,求出最后胜利者的编号。

 

           两种思路:

               第一种模拟法,模拟游戏的全过程,时间复杂度为O(m*n)。  

              一开始模拟法的时间复杂度是O(M*N) 没弄懂,当时思考,如果是链表 时间复杂度的确O(m*n),可是数组呢?数组查找到一个目标所用的时间复杂度为O(1),n个数那就O(n)呗。 为啥别人的博客都说是O(M*N),最后我思考如果我用数组写这个程序的思路,发现第一次循环可以直接用O(1)找出报数的结点,可下一次循环,就不好找了,思考后的解决办法是把找到的结点赋值为负数表示为已找过,这样循环下来找到最后的结果时间复杂度为O(m*n)。。。无语。。。委屈

 

            第二种是运用数学思想。

            资料来源:http://blog.163.com/soonhuisky@126/blog/static/157591739201321341221179/

            资料来源:http://tieba.baidu.com/p/835412434

 

          看了资料才稍微懂了点,引用资料2的例子:令 m=7 n=5

 

第1轮        第2轮        第3轮        第4轮           最后一轮(第五轮)
0123401    0123012    0120120    0101010    0000000      (编号)
0123401    2340234    0230230    2323232    3333333      (对应编号的值)

最后一轮结果值3,其实是第四轮(倒数第二轮)结果为3对应的编号1;

第四轮编号为1所对应的值3,其实是第三轮结果为3对应的编号2;

第三轮编号为2所对应的值3,其实是第二轮结果为3对应的编号1

第二轮编号为1所对应的值3,其实是第一轮结果为3对应的编号3


我们不妨把第2轮,第3轮,第4轮对应的编号写出:
第二轮:          第三轮:         第四轮:         第五轮:
编号2——0      编号3——0     编号1——0     编号1——0
编号3——1      编号0——1     编号2——1
编号4——2      编号1——2
编号0——3

 

 值的逆推列表:

            最终结果                            第几轮

            3 == (1 + 7) % 5   ----------  4

            1 == (2 + 7) % 4   ----------- 3

            2 == (1 + 7) % 3   ----------  2

            1 == (0 + 7) % 2   -----------  1

 

数学归纳法得出公式 :

 f[1] = 0 
 f[n] = (f[n-1]+m)%n (n >= 2)

 

 

说明:

如资料1所说的:

我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):
  k  k+1  k+2  ... n-2, n-1, 0, 1, 2, ... k-2并且从k开始报0。
现在我们把他们的编号做一下转换:

k     --> 0
k+1   --> 1
k+2   --> 2
...
...
k-2   --> n-2
k-1   --> n-1

 

将n个人 转换成n-1个人 的具有唯一、相同解 ,n 转换成 n-1去除掉的是第一个排除的数。 如果知道 n-1的终解, 那么这个解当n时k~ k-1序列的对应的终解

 n-1转换成 n-2除掉的是第二个排除的数。依次类推。。。

 

0 0
原创粉丝点击