Josephus问题(转载)

本文转载自Josephus问题
 
Josephus问题是建立在历史学家Josephus的一个报告的基础之上,该报告讲述了他和40个士兵在公元67年被罗马军队包围期间签定的一个自杀协定,Josephus建议每个人杀死他的邻居,他很聪明的使自己成为这些人中的最后一个,因此获得生还。

注意:本文中所用定义并非标准,只为叙述方便。

第一类Josephus数
假 设n 个竞赛者排成一个环形,依次顺序编号1,2,…,n。从某个指定的第1 号开始,沿环计数,每数到第2个人就让其出列,且从下一个人开始重新计数,继续进行下去。这个过程一直进行到所有的人都出列为止。最后出列者为优胜者。优 胜者的号码定义为第一类Josephus数,J(n)。显然,1<=J(n)<=n。
对于第一类Josephus数,在《Concrete Mathematics》(参考文献[1])第一章1.3有很详尽的讨论。下面的递推公式引用其中:
J(1)     = 1;
J(2*n)   = 2*J(n)-1,  n>=1;
J(2*n+1) = 2*J(n)+1,  n>=1;
简单推导可得:J(n) = 1 + 2*n - pow(2, (1 + floor(ln(n)/ln(2))))
1 floor()函数表示向下取整
2 pow(x, y)函数表示x的y次幂
表达式C语言描述:J(n) = 1 + (n << 1) - (2 << (int)(ln(n)/ln(2)))

第二类Josephus数
竞赛规则不变,只是每次让第m个人出列。这种情况下,优胜者的号码定义为第二类Josephus数,J(n,m)。可见第一类Josephus数J(n)就是m=2的特例J(n,2)。
在参考文献[4]中给出了J(n,3)的非递归算法,在此不做过多叙述。这里讨论其他一般情况。

为讨论简单化,先规定1<=m<=n。
(文中用mod表示取模操作。)
显然有公式,
J(n,m) = (J(n-1,m) + m) mod n

第三类Josephus数
竞 赛规则同第二类Josephus数,只是刚开始计数的初始位置不是第1号,而是第i号(1<=i<=n)。这种情况下,优胜者的号码定义为第 三类Josephus数,J(n,m,i)。显然第二类Josephus数J(n,m)就是i=1的特例J(n,m,1)。
很显然,J(n,m,i)=(J(n,m,1)+i-1) mod n
第三类Josephus数的引入主要是为了让第二类Josephus数的递归变得更加简单化。

第四类Josephus数
竞赛规则同上,定义第k个出列的人的号码为第四类Josephus数,J(n,m,i,k)。
参考文献[3]对此做了一些研究。

参考资料
[1] R.L. Graham, D.E. Knuth, O. Patashnik, Concrete Mathematics(2nd edition), 1994.
[2] Fatih Gelgi, Time Improvement on Josephus Problem, 2002.
 
文件: gelgi02time.pdf
大小: 193KB
下载: 下载

[3] Lorenz Halbeisen, Norbert Hungerbühler, The Josephus Problem.
http://citeseer.ist.psu.edu/235856.html
[4]  Andrew M. Odlyzko, Herbert S. Wilf, Glasgow Mathematical Journal, Functional iteration and the Josephus problem, 1991.
http://citeseer.ist.psu.edu/odlyzko91functional.html
文件: odlyzko91functional.pdf
大小: 125KB
下载: 下载
 

 

 原文地址 http://blog.csdn.net/firetoucher/archive/2006/03/22/632838.aspx
posted @ 2011-03-10 11:04  westfly  阅读(941)  评论(0编辑  收藏  举报