用具体数学解决约瑟夫环问题

本文探讨了一种解决约瑟夫环问题的高效算法,通过新的编号方式将时间复杂度降低到O(logn)。通过数学推导,得出存活者编号的计算公式,并提供了算法伪代码,实现了快速求解最后剩下的人的原始编号。
摘要由CSDN通过智能技术生成

问题描述:

有 n 个人围成一个圈,每 q 个人踢掉一个人,问最后留下来的人是几号?

使用链表暴力求解时间复杂度是 O(qn),递归的话是 O(n) ,使用这个方法可以加速到 O(logn).


解法思路:

假设初始编号为 1,2,3 … n ,现在考虑一种新的编号方式。

第一个人不会被踢掉,那么他的编号从 n 开始往后加 1 ,变成 n+1 ,然后第二个人编号变为 n+2 ,直到第 q 个人,他被踢掉了。

然后第 q+1 个人编号继续加 1 ,变成了 n+q ,依次下去。

考虑当前踢到的人编号为 kq,那么此时已经踢掉了 k 个人,所以接下去的人新的编号为 n+k(q-1)+1…

所以编号为 kq+d 的人编号变成了 n+k(q-1)+d ,其中 1<=d<q;

直到最后,可以发现活下来的人编号为 qn ,问题是怎么根据这个编号推出他原来的编号?

以 n=10 , q=3 为例,下图就是每个人新的编号:

1 2 3 4 5 6 7 8 9 10
11 12 T 13 14 T 15 16 T 17
18 T 19 20 T 21 22
T 23 24 T 25
26 T 27
28 T
29
30

令:
N = n + k ( q − 1 ) + d \quad N=n+k(q-1)+d N=n+k(q1)+d
则他上一次的编号为:
k q + d = k q + N − n − k ( q − 1 ) = k + N − n \quad kq+d=kq+N-n-k(q-1)=k+N-n kq+d=kq+Nn

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值