约瑟夫环问题

  • 前言
  • 约瑟夫环问题一
  • 约瑟夫环问题二
  • 约瑟夫环问题三
  • 约瑟夫环问题四
  • 约瑟夫环问题五
  • 约瑟夫环问题六
  • 约瑟夫环问题七
  • 约瑟夫环问题解决一 —— 模拟队列
  • 约瑟夫环问题解决二 —— 环形链表
  • 约瑟夫环问题解决三 —— 动态规划

前言

今天在浏览技术文章时看到的这么一个问题,感觉甚是有趣,专门来研究研究下,在浏览众多关于约瑟夫讲解的文章后,便进行一个较为详细的总结。

约瑟夫问题,是一个计算机科学和数学中的问题,在计算机编程的算法中,类似问题又称为约瑟夫环,又称“丢手绢问题”。约瑟夫问题在各大刷题网站有各种各样的变体,这里列举了一部分的问题描述,但不管怎么变,其意思都是一样的。

约瑟夫环问题一

0,1,…,n−1 这 n 个数字排成一个圆圈,从数字 0 开始,每次从这个圆圈里删除第 m 个数字。求出这个圆圈里剩下的最后一个数字。

例如,0、1、2、3、40、1、2、3、4 这 5 个数字组成一个圆圈,从数字 0 开始每次删除第 3 个数字,则删除的前 4 个数字依次是 2、0、4、12、0、4、1,因此最后剩下的数字是 3。

约瑟夫环问题二

一个由 n 个节点构成的数环,从某个点开始依次编号,然后每一轮剔除第 k 个节点,剩余的形成新的环,从被删除的节点的下一个开始计数,继续剔除,直至只剩下一个节点,求这个节点在最开始 n 个节点中是第几号。

约瑟夫环问题三

N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。

约瑟夫环问题四

已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,要求找到最后一个出列的人

约瑟夫环问题五

一只猫抓住了n只老鼠,其将老鼠排成一圈,依次按照1~m报数,报m值的吃掉,直到只剩下一只老鼠时,猫将其放生,求获生的老鼠编号。

约瑟夫环问题六

海盗船长抓到了n个俘虏,但是海盗船只能容许再多一个人,于是他决定让这些俘虏围成一个圈,然后1234的顺序报数,谁报到m就枪毙谁。那么这些俘虏谁可以存活下来呢?

约瑟夫环问题七

这个就是leetcode1823的题—— 找出游戏的获胜者。这7种描述,不管怎么变,万变不离其宗。对于上述各个问题描述中出现的m,因为m是不确定的,所以没有确切的公式推导,但若是m=2,就有准确的数学递归公式,详情请看约瑟夫环数学问题

约瑟夫环问题解决一 —— 模拟队列

对于约瑟夫环问题,我们可以采取模拟队列的方式,将n个元素一一进队,之后将队首元素出队加到队尾,依次加k-1次,第k次要删除的那个元素就是队首元素了,将其出队即可,循环往复,直至队中只剩最后一个元素。返回这个元素即可。

public static int findTheWinner(int n,int k){Queue<Integer> queue = new ArrayDeque<>();for (int i = 1; i <= n ; i++) {queue.offer(i);}while (queue.size() != 1){for (int i = 1; i < k ; i++) {queue.offer(queue.poll());}queue.poll();}return queue.peek();}

约瑟夫环问题解决二 —— 环形链表

对于约瑟夫环问题,我们还可以采用环形链表的方式来解决,构建一个长度为n的链表,各节点值为对应的索引,每轮删除第 m 个节点,直至链表长度为 1 时结束,返回最后剩余节点的值即可。

public static int findTheWinner(int n,int k){if (k==1){//按一个人计数,最后一个人就是赢家return n;}Node head = new Node(1);Node tmp = head;for (int i = 2;i<=n;i++){//建立长度为n的链表tmp.next = new Node(i);tmp = tmp.next;}tmp.next = head;//构成环tmp = head;int i = 0;while (tmp.val!=tmp.next.val){//当还有一个人的时候,值才会相等,退出循环i++;if (i==k-1){tmp.next = tmp.next.next;//每轮到第k个人,就kill掉i=0;//然后重新计数}tmp = tmp.next;}return tmp.val;}

约瑟夫环问题解决三 —— 动态规划

对于约瑟夫环问题,可以根据动态规划的方式解决,所谓动态规划就是把大问题分成小问题进行处理找到逻辑关系【递推公式】

  • 假定f(n,m)表示的是第一步从0开始对区间0~n-1不断进行删除操作。
  • 起点是0,区间是0~n-1,被删除的元素是(m-1)%n 用k表示。
  • 第二步删除时,起点是 k+1 ,结果可以表示为f(n-1,k)。
  • 根据问题规模有由变成n-1,前后位置差为k。
  • 递推得到f(n,k)= (f(n-1,k)+ k)% n

递归方式:

    public static int findTheWinner3(int n,int k){if (n<=1){return n;}int ans = (findTheWinner3(n-1,k)+k)%n;return  ans== 0? n:ans;}

采用迭代进行优化:时间复杂度O(n) ,空间复杂度O(1)

public static int findTheWinner2(int n,int k){int pos = 0;for (int i = 2; i < n+1; i++) {pos = (pos + k)%i;}return pos+1;}

约瑟夫环问题 —— 算法相关推荐

  1. java实现约瑟夫环完整算法_Java简单实现约瑟夫环算法示例

    Java简单实现约瑟夫环算法示例 发布时间:2020-10-01 14:19:56 来源:脚本之家 阅读:104 作者:perfect亮 本文实例讲述了Java简单实现约瑟夫环算法.分享给大家供大家参 ...

  2. Python 猴子选大王(约瑟夫环)算法

    def KingElect(totalNum, startNum, intervalNum):'''猴子选大王totalNum:猴子总数tartNum:开始序号intervalNum:间隔数'''mo ...

  3. 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序(约瑟夫环问题)

    用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.写出C程序 // 用户输入M,N值,从1至N开始顺序 // 循环数数,每数到M输出该数值, // 直至全部输出 #incl ...

  4. 实验题目:约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数。从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一个人

    实验题目:约瑟夫环问题:设编号为1,2,3,--,n的n(n>0)个人按顺时针方向围坐一圈,m为任意一个正整数.从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一 ...

  5. 一文读懂约瑟夫环算法

    2020-05-25 20:13:40 作者 | 扬帆向海 责编 | 王晓曼 出品 | CSDN博客 问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的 ...

  6. 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...

    题目链接 LeetCode 390. 消除游戏[1] 题目描述 给定一个从 到 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右 ...

  7. 数据结构与算法--我们来玩丢手绢(约瑟夫环问题)

    我们来玩丢手绢 昨天我们打扑克,今天我们丢手绢 丢手绢我们都知道这个游戏,他的由来由约瑟夫 (Josephus)提出来的 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,3 ...

  8. c语言约瑟夫环问题,C++_详解约瑟夫环问题及其相关的C语言算法实现,约瑟夫环问题 N个人围成一圈 - phpStudy...

    详解约瑟夫环问题及其相关的C语言算法实现 约瑟夫环问题 N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推 ...

  9. C语言约瑟夫报数出圈算法,c语言实现约瑟夫环问题

    (一)基本问题 1.问题描述 设有编号为1,2,-,n的n(n>0)个人围成一个圈,每个人持有一个密码m.从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m ...

最新文章

  1. 哲学是什么?(选自:苏菲的世界)
  2. java通过kerberos认证连接hdfs并写数
  3. 在maven中引用github上的资源
  4. java.lang.NoSuchMethodError: antlr.collections.AST.g(truts2与hibernate jar包(antlr-2.7.2.jar)冲突)
  5. 循环节模板 NOJ427Number Sequence
  6. Java黑皮书课后题第7章:***7.36(游戏:八皇后问题)经典的八皇后难题是要将八个皇后放在棋盘上,任何两个皇后都不能相互攻击(没有两个皇后在同行、同列、同一对角线)。编写程序显示一个解决方案
  7. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU启动那些事(8)- 从Raw NAND启动
  8. android cad 开源库,KiCad 开源元件库收集
  9. 原因原来默认预检测会检测是否存在多选框
  10. iPhone SE 2渲染图再曝光:已加入浴霸摄像头豪华套餐
  11. 95-850-020-源码-心跳-JobMaster与TaskExecutor之间的心跳检测
  12. Apollo ROS安装教程
  13. 阿里云服务器价格表,阿里云服务器最新收费标准大全
  14. 西南民族大学计算机院方导师,暨南大学信息科学技术学院导师教师师资介绍简介-高博宇...
  15. 运行JavaScript代码片段的19种工具
  16. DEDE源码分析与学习--index.php文件解读
  17. 我的去 Google 化的安卓之旅
  18. 茶馆人物表(按字母顺序)
  19. make install - make uninstall - make clean 命令介绍
  20. camera.swf java,ipcamera-for-android 手机变成IP Camera

热门文章

  1. 怎样更改图片尺寸?如何自定义修改图片大小?
  2. 为什么说大公司不是天堂,里面有哪些坑?
  3. MySQL - 学习/实践 - 多多翻阅补充
  4. python拆分kml文件
  5. Java前端,悬浮窗口html+js
  6. 论文降重 | paperask自建库功能
  7. 单身程序猿告别单身的必备利器
  8. java实现二维码生成的几个方法
  9. 雷军称小米不会进军电动汽车及房地产等新领域
  10. 25套用于 Web UI 设计的免费 PSD 网页元素模板