从数学分析的角度解决约瑟夫环
来源:互联网 发布:深圳数控车床编程招聘 编辑:程序博客网 时间:2024/05/01 22:06
约瑟夫环是个经典的问题,相信会单向链表的人都会解决,但显然复杂度是O(mn),若要高效,则必须在数学分析上做点功夫。
假设这n个人编号为0~n-1,报数从0报到m-1。令k=m mod n,显然k-1为第一位退出者的编号。剩下的n-1人依次为:k,k+1,k+2,。。n-1,0,1,2,。。。,k-2。
我们换个角度看,这n-1人组成了一个新的约瑟夫环,开始新一轮的报数,而且新约瑟环中的0号就是原约瑟夫环的k号。那么按照这个数按序我们重新编号:
旧约瑟夫环(人)
k
k+1
k+2
.....
n-1
0
1
2
...
k-2
新约瑟夫环(n-1人)
0
1
。。。
n-k-1
n-k+1
n-k+2
n-k+3
.....
n-1
他们的对应关系已经很明显了,p=(p+k)mod n
既然通过n能够推出n-1,那么n-1一样能推出n-2...2,
推出1.算法已经出来了。f(i)表示i个人报数m最后剩下的人的编号。
则最后结果为f(n),有如下的递推关系
f(1)=0;
f(i)=(f(i-1)+m)mod i;i>1;
源程序为:
#include<iostream>
using namespace std;
void main()
{
long n,m,i,f=0;
cin>>n>>m;
for(i=2;i<=n;i++)
for(f+m)%i;
cout<<"最后人的编号为"<<f+1<<endl;
}
本程序采用迭代,实质是递推思想。
时间复杂度是O(n)相对于模拟算法已有很大的提高。
- 从数学分析的角度解决约瑟夫环
- 约瑟夫环问题的数学分析解
- 数学分析题:约瑟夫环
- 约瑟夫环问题(数学分析法)
- 从农夫砍大白菜到解决约瑟夫环的问题!
- 约瑟夫环的解决
- 约瑟夫环的解决
- 约瑟夫环的数学解决
- 约瑟夫环问题的解决
- 约瑟夫算法(数学分析法)
- 解决fastjson无序的问题--从源码的角度来看
- 从源码角度 解决Volley框架乱码的问题
- 从源码角度 解决Volley框架乱码的问题
- 从源码角度看滑动冲突问题的解决
- 利用buildConfigField从另一种角度解决BuildConfig.DEBUG的坑。
- 约瑟夫环的2种解决
- 约瑟夫环的O(n)解决算法
- PHP解决约瑟夫环的问题
- c#数组
- 在VirtualBox中安装Ubuntu 的增强工具包
- 服务器开发要点
- 25个你应该阅读的Android网站
- 网络日志(2010.4.17)
- 从数学分析的角度解决约瑟夫环
- 第一次来CSDN
- memset的进一步理解
- MFC下屏蔽ESC、回车键以及ALT+F4
- [URAL 1553]Caves and tunnels(树链剖分)
- u-boot启动过程分析(源码)
- 一个关于HQL预编译的简单问题
- 还是要读英文原著
- Fzu_1062 洗牌问题