前言
概念介绍
1. 基本概念
- 约瑟夫问题,有时也称为约瑟夫斯置换,是一个计算机科学和数学中的问题。在计算机编程算法中,类似问题被称为约瑟夫环,又称丢手绢问题。
2. 问题来历
- 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
- 然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。
- 问题是,一开始要站在什么地方才能避免被处决。Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
原理讲解
- 该问题的一般表现形式:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
- 我们以N=12,M=5为例讲解约瑟夫环的原理。
- 在未开始报数时,大家都存活着(以绿色代表)。此时效果如下图
- 从第1个人开始报数字1,第5个人报了数字5,所以把第5个人处决掉。此时效果如下图
- 继续从第6个人开始报数字1,第10个人报了数字5,所以把第10个人处决掉。此时效果如下图
- 继续从第11个人开始报数字1,第3个人报了数字5,所以把第3个人处决掉。此时效果如下图
- 继续从第4个人开始报数字1,第9个人报了数字5,所以把第9个人处决掉。此时效果如下图
- 继续从第11个人开始报数字1,第4个人报了数字5,所以把第4个人处决掉。此时效果如下图
- 继续从第6个人开始报数字1,第12个人报了数字5,所以把第12个人处决掉。此时效果如下图
- 继续从第1个人开始报数字1,第8个人报了数字5,所以把第8个人处决掉。此时效果如下图
- 继续从第11个人开始报数字1,第7个人报了数字5,所以把第7个人处决掉。此时效果如下图
- 继续从第11个人开始报数字1,第11个人报了数字5,所以把11个人处决掉。此时效果如下图
- 继续从第1个人开始报数字1,第2个人报了数字5,所以把2个人处决掉。此时效果如下图
- 继续从第6个人开始报数字1,第6个人报了数字5,所以把6个人处决掉。此时效果如下图
效果展示
更多算法学习请关注我的公众号
说明
- 在公众号中回复“算法源码”即可获取十大经典算法源码
- 在公众号中回复“算法书籍”即可获取经典入门算法书籍
- 在公众号中回复“数据结构”即可获取数据结构相关源码