约瑟夫环问题
来源:互联网 发布:淘宝网男装毛衫 编辑:程序博客网 时间: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除掉的是第二个排除的数。依次类推。。。
- 约瑟夫问题、约瑟夫环
- Josephus约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题(Josephus)
- 约瑟夫环问题--java
- 约瑟夫环问题 Josephus
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 求解约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 双栈模拟队列
- 值传递legend
- javascript自定义对象
- RawCap抓包工具的使用介绍
- Linux 安装wps 及出现问题解决
- 约瑟夫环问题
- 安装PIG
- 梁静茹罗琦同天产子
- 递归(一)
- 从Unicode到UTF-8的编码
- 再识MinGW和MSYS(二)
- C column of Pointer <2>
- ibatis动态查询条件
- Objective-C ,ios,iphone开发基础:JSON解析(使用苹果官方提供的JSON库:NSJSONSerialization)