[算法]约瑟夫环问题

本文介绍了约瑟夫环问题的详细背景及O(n)解法,通过分治思想,将问题简化为求解n-1个人的情况,并给出公式x = (y + m) % n用于找出n个人游戏的最后剩余者。该解法具有O(1)的Conquer阶段时间复杂度,总时间复杂度为O(n)。
摘要由CSDN通过智能技术生成

昨天有个同学跟我说约瑟夫环问题的O(n)解法很费解,看不懂,所以我就看了一下,发现这种解法真是太奇妙了,所以打算写一下。

约瑟夫环问题(Josephus)问题描述:

      输入m和n,有n个人编号从0到n-1,这n个人开始从0到m-1顺序循环数数,每次数到m-1的人就出列,剩下的人继续,直至剩余最后一人,求最后剩余的那个人的编号。

我觉得总体上来讲O(n)算法应该是分治的思想,首先是Divide,将n个人的游戏变成n-1个人,然后再变成n-2个人,......,直到最后剩余1个人。然后是Conquer,如果我们知道n-1个人的游戏结果的话,怎么得到n个人游戏的结果呢?我们来看看从n个人变成n-1个人后的情况,当m>n时,需要把下面的m变成m%n,为了简便我就直接写m了。

0,1,2,3,4,…,m-2, m-1,m,…,n-1 // 原始n个人的编号,第一轮报数后,m-1将被删除
•m,…,n-1, 0,1,2,3,4,…,m-2// 把前m-1人挪到编号n-1后,即剩余n-1个人的原始编号{x}
•0,…,n-m-1, n-m,…,n-2// 剩余n-1个人重新编号{y}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值