约瑟夫环讲解及数学推导

约瑟夫环是一个著名的数学问题,源于一个历史故事。问题描述了一群人围成一圈,按照特定规则淘汰,直至只剩一人。当人数n和报数m满足特定条件时,可以使用递归公式f(n,k)=(f(n−1,k)+k)%n找到最后幸存者的编号。该问题涉及序列操作和取模运算,可用于探讨和理解递归算法。
摘要由CSDN通过智能技术生成

什么是约瑟夫环

讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后kill所有人。
于是约瑟夫建议:每次由其他两人一起kill一个人,而被kill的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在kill了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投降了罗马。
对上述故事进行抽象提取就形成了一个经典的数学问题:约瑟夫环,其规则是这样的:

  1. 有n个人,其编号为1~n,这n个人围成一个圆
  2. 从编号为1的人开始报数,报数为m的人出局(这里的报数从1开始,和军训报数是一样的)
  3. 从出局的人下一个人开始报号,重复上述过程,直到只剩下一个人为值。
    下面举一个例子:假设有11个人,每报数为3的人出局,最后剩下的人的编号:
    在这里插入图片描述
    可以看出最后剩余的人编号为7。
    下面说一下它的推导过程,设人数为n,报数为k。
    特例情况:n = 2m,k = 2
    这种情况下,每次去掉一般元素,且每轮报号的元素都是从1开始,因此最后能剩下的人一定是编号为1的人,即第一个编号的人。
    那如果n不是2的幂次方,k = 2的情况:
    这里假设 n = 2m + t,这里
    这里多了t个人,那如果我们现踢出这t个人,那么剩下的问题就变成了上述的幂次方问题,踢出的t个人的最后一个人的编号为2t,那么从2t+1开始报号就变成了上面的问题,我们知道上面问题的最候胜利者是第一个编号的人,所以这里最后剩下的人是(2t+1),这里t的取值范围为
    t ≤ n − 1 2 t \le \frac{n-1}{2} t2n1

那么一般情况下其公式应该是什么样的?先上结论,这里设f(n,k)表示n个人,报数为k的人出局最后的胜利者的编号(编号从0开始)
f ( n , k ) = ( f ( n − 1 , k ) + k ) % n f(n,k) = (f(n-1,k)+k)\%n f(n,k)=(f(n1,k)+k)%n
初始化f(1,k) = 0(k>1)。
下面给出其推导过程:
现在给出一个编号序列,0~n-1,k代表出局的人的下一个编号(这里报号时从0开始,那么第一次出局的人就是k-1),此时k-1出局,剩下的序列为
0 1 2 3… k-2 k k+1 …n-1
下一次报号的起始位置为k,现在我们把这个序列变换一下,把前面0~k-2个序列拼接到后面得到的序列
k k+1 … n-1 n …n+k-2
然后把这个序列与0~n-1进行一一映射,即
k -> 0
k+1 ->1

n+k-2 -> n-2

现在我们假设n-1个人报号为k最后的胜利者为x,那么按照上面的映射其在n个序列中结果就为(x+k),由于(x+k)可能为是n~n+k-2这里面序列,而这个序列实际对应的序列应该是0到k-2,故取模一下就能得到对应的映射,所以(x+k)% n,上式得证。注意这里的编号是从0开始,这是因为取模之后有0这个序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值