推广的约瑟夫问题(Josephus problem)递推公式推导过程

本文详细介绍了约瑟夫问题的递推公式推导过程,从问题描述、递推关系到时间复杂度分析,并通过C++代码展示了算法实现。最后通过正确性检验验证了算法的准确性。
摘要由CSDN通过智能技术生成

推广的约瑟夫问题(Josephus problem)递推公式推导过程

问题描述

n n n 个人站成一圈,编号为 1... n 1...n 1...n 。从 1 号开始,数到第 m m m 个人,淘汰。再从 m + 1 m+1 m+1 号开始,再数到第 m m m 个人,淘汰。以此类推,直到剩下最后一个人。求最后一个人的编号。比如,当 n = 8 , m = 3 n=8, m=3 n=8,m=3 时,如图所示。

约瑟夫问题示例
淘汰的顺序依次为:3、6、1、5、2、8、4。最后剩下的人编号为 7。注意,可能会存在 m > n m>n m>n 的情况。

递推关系推导过程

J ( n , m ) J(n, m) J(n,m) n n n 个人每次淘汰第 m m m 个人时剩下的编号,如上例有 J ( 8 , 3 ) = 7 J(8,3)=7 J(8,3)=7

n ≥ m > 1 n \geq m>1 nm>1 时,设 n = p m + k , n=pm+k, n=pm+k,其中 p p p n n n 除以 m m m 的商, k k k 为余数,即有 p = ⌊ n m ⌋ , k = n  mod  m . p=\left\lfloor\frac{n}{m}\right\rfloor,\quad k=n\text{ mod } m. p=mn,k=n mod m.
在第一圈,淘汰的人编号依次为 m , 2 m , . . . , p m m,2m,...,pm m,2m,...,pm ,共 p p p 个,如图(红色标记)。
约瑟夫问题示例2
淘汰完这 p p p 人,剩余 p ( m − 1 ) + k p(m-1)+k p(m1)+k 人,记为 q q q 。在这剩下的 q q q 个人中,从 p m + 1 pm+1 pm+1 号开始重新编号 1 到 q q q ,每 m m m 个人淘汰一位,便转化为一个子问题 J ( q , m ) J(q,m) J(q,m)。再找到新编号与旧编号的关系,即可找到递推关系,如图所示,蓝色为新编号。
约瑟夫问题示例3
编号的对应关系可以分成 p + 1 p+1 p+1 组,前 p p p 组各有 m − 1 m-1 m1 个对应关系,最后一组有 k k k 个对应关系,如表格所示。

组号 1 2 p p+1
原编号 1 , ⋯   , m − 1 1,\cdots, m-1 1,,m1 m + 1 , ⋯   , 2 m − 1 m+1,\cdots,2m-1 m+1,,2m1 ( p − 1 ) m + 1 , ⋯   , p m − 1 (p-1)m+1,\cdots,pm-1 (p1)m+1,,pm1 p m + 1 , ⋯   , p m + k pm+1,\cdots,pm+k pm+1,,pm+k
新编号 1 + k , ⋯   , m − 1 + k 1+k,\cdots,m-1+k 1+k,,m1+k m + k , ⋯   , 2 m − 2 + k m+k,\cdots,2m-2+k m+k,,2m2+k ( p − 1 ) m − ( p − 1 ) + 1 + k , ⋯   , p m − p + k (p-1)m-(p-1)+1+k,\cdots,pm-p+k (p1)m(p1)+1+k,,pmp+k 1 , ⋯   , k 1,\cdots,k 1,,k

为了更容易地找到对应关系,可以把原编号和新编号的 1 1 1 号对齐,具体的操作方法是将 q q q 个新编号围成的圈顺时针旋转 k k k 个距离,形成一个临时编号,记为 R ( q , m ) R(q, m) R(q,m) ,同时将新编号记为 J ( q , m ) J(q, m) J(q,m) ,原编号记为 J ( n , m ) J(n, m) J(n,m) ,得到新的对应关系,如表格和图所示,绿色为临时编号,蓝色为新编号。

组号 1 2 p p+1
J ( n , m ) J(n, m) J(n,m) 1 , ⋯   , m − 1 1,\cdots, m-1 1,,m1 m + 1 , ⋯   , 2 m − 1 m+1,\cdots,2m-1 m+1,,2m1 ( p − 1 ) m + 1 , ⋯   , p m − 1 (p-1)m+1,\cdots,pm-1 (p1)m+1,,pm1 p m + 1 , ⋯   , p m + k pm+1,\cdots,pm+k pm+1,,pm+k
R ( q , m ) R(q, m) R(q,m) 1 , ⋯   , m − 1 1,\cdots, m-1 1,,m
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值