一步一步求解约瑟夫(Joseph)问题

本文介绍了约瑟夫问题的两种解法:模拟法和数学公式法。模拟法通过循环链表模拟过程,时间复杂度为O(N*m),而数学公式法利用递归公式,时间复杂度为O(N),空间复杂度为O(1)。文章还探讨了约瑟夫问题的变种问题。
摘要由CSDN通过智能技术生成

约瑟夫(Joseph)问题的解决方法

问题描述

最初Joseph问题是这样的:有n个人(分别编号1,2……n)围成一圈,这些人轮流数数(编号为1的人开始,从1开始数),当数到m的人就会被处决。接着,后面的人继续从1开始数数,如此下去直到最后剩下来的那个人才能活命。当然Joseph先生非常聪明,他总是选择能最后剩下的那个位置站位。

用图示来阐述Joseph问题更加直观:如下图,假如有A,B……E共五个人(为了方便描述,这里用字母来对每个人编号),m= 3(即数到3的人出去);则第一个被处决的人是C,接着D报1,E报2,然后A报3,于是A被处决,如此进行下去,E,B又先后被处决,最后活下来的是D,因此最后输出答案就是D(或者输出其下标:3)。


解法一:模拟法

实现:

求解约瑟夫问题最直观(但非最高效)的方法就是直接模拟了。借助循环链表(或者数组模拟的循环链表)来表示约瑟夫环,然后就模拟数数过程,当数到m时就将该元素从循环链表中删除,直到循环链表中只剩一个元素为止!在这里我用数组来模拟循环链表,从而实现约瑟夫环问题的求解,代码如下:


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值