应用实例 约瑟夫环问题
约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的。这个问题最初的原型是约瑟夫在公元70年的时候,在抗击罗马的战斗中一直进行顽强的抵抗,守住了裘达伯特城达47天之久,最后城市沦陷以后,他和四十多名将士就躲在一个洞穴里,当时大家都非常顽强说:“要投降,吾宁死”,后来约瑟夫就想了一个办法,我们每个人把旁边的一个人杀死,轮流的杀死,杀死的顺序由抽签来决定,最后他抽到了最后一签,但他也没杀死他旁边的这个人,他们两个人一起活了下来,然后投降了罗马。
约瑟夫环(Josephus)问题本身的描述为:编号为1,2,…,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数,报m的那个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列;如此下去,直至圆桌周围的人全部出列为止。
约瑟夫环(Josephus)问题的实现提示:
算法分析:采用单向循环链表
结点结构:id passwoed next
解决问题的基本步骤如下:
(1)建立n个结点(无头结点)的单向循环链表。
(2)从链表第一个结点起循环计数寻找第m个结点。
(3)输出该结点的id值,将该结点的password作为新的m值,删除该结点。
(4)根据m值不断从链表中删除结点,直到链表为空。
具体可参考https://blog.youkuaiyun.com/ITmincherry/article/details/104116010
循环链表
循环链表(Circular Linked List):是一个首尾相接的链表。
特点:将单链表最后一个结点的指针域由NULL改为指向头结点或线性表中的第一个

本文介绍了约瑟夫环问题及其使用循环链表的解决方案。约瑟夫环是一个经典的算法问题,通过建立循环链表,按照特定规则删除节点,最终找出存活的节点。文章详细阐述了循环链表的特点,并提供了两种不同的算法实现,包括时间复杂度分析。
最低0.47元/天 解锁文章
2719

被折叠的 条评论
为什么被折叠?



