约瑟夫环问题学习小记
来源:互联网 发布:淘宝助理官方下载免费 编辑:程序博客网 时间:2024/06/05 18:35
问题的提出
有n个人围成一个圈,按顺时针编号为1到n。现在从编号为1的人开始报1,下一个人报2,如此类推,报到m的人就退出,接着下一个人继续从1开始报。问最后一个剩下的人是谁。
解法1
可以通过链表的形式来模拟这个过程,时间复杂度为
解法2
我们把每个人的编号都-1,也就是编号变为了从0到n-1,显然这两个问题是等价的。
第一个出去的人的编号肯定是
那么剩下的人就是
考虑对这些人的编号做一下变换:
…
…
不难发现其实就是把
那么当我们把第
通过这种思路不断地递归下去不难发现有如下递推式:
设
至此我们得到了一个比算法1要优秀的
小拓展
当n很大而m很小的时候,比如说
当模数逐渐变大的时候,我们发现可能一次可以跳很多步且在这期间实际并不用取模,这时就可以一次性把这些位置都处理掉,从而大大的节约时间。
设当前模数为i,每一步跳k个位置,我们一次性跳t步。
不难得到
那就是说这t步我们是可以一次性处理掉的。
代码
int solve(int n,int k){ int i=2,w=0; while (i<=n) { int t=(i-w-1)/(k-1); if ((i-w-1)%(k-1)==0) t--; if (i+t>n) {w+=(n-i+1)*k;break;} w+=t*k;i+=t; w=(w+k)%i;i++; } return w;}
在维基百科上面还有一种更优秀的解法:
至于如何证明,这个坑还是留着以后再填吧。据说 具体数学 里面有关于这条式子的证明。
- 约瑟夫环问题学习小记
- 约瑟夫环学习小记
- [java学习]约瑟夫环问题
- 约瑟夫问题、约瑟夫环
- 算法学习笔记之约瑟夫环问题
- 算法学习之约瑟夫环问题
- 学习 3.4.1约瑟夫问题
- 【LA3882】约瑟夫问题变形学习
- 算法学习八----约瑟夫问题
- Josephus约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题(Josephus)
- 约瑟夫环问题--java
- 约瑟夫环问题 Josephus
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 堆排序
- Walkthrough: Creating and Using an ASP.NET Web Service in Visual Web Developer Visual Studio 2010 O
- ofbiz总结——实体里的关系名称
- 英特尔宣布推出“Nervana”神经网络处理器
- Google公布OpenFermion:量子计算机的开源软件包
- 约瑟夫环问题学习小记
- 希尔排序
- 《浪潮之巅》作者吴军最新演讲:超级人工智能
- 人工智能如何驱动实体经济?六大领域展望
- 图像基础16 图像滤波与除噪——中值滤波
- angular购物车增加订单
- AnngularJs购物车的简单操作
- linux命令学习1
- vector容器基本用法