Josephu(约瑟夫)问题解析
Josephu问题为:
设置编号为1,2,3,......n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1看是报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人出列,以此类推,直到所有人出列为止,由此产生一个出队编号的序列。
提示:用有个不带头的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。
代码:
public class Demo{
public static void main(String[] args){
CycLink cyclink=new CycLink();
cyclink.setLen(5);
cycLink.createLink();
cyclink.show();
}
} //小孩
class Child{ //编号
int no;
//结点
Child nextChild=null;
public Child(int no){
//给编号
this.no=no;
}
} //环形链表
class CycLink{ //先定义一个指向链表第一个小孩的引用
//指定第一个小孩的引用不能动,不然以后找不到他了
Child firstChild=null;
//定义一个游标
Child temp=null;
//表示共有几个小孩
int len=0; //设置链表大小
public void setLen(int len){ this.len=len;
} //初始化环形链表
public void createLink(){
for(int i=1;i<=len;i++){
if(i==1){
//创建第一个小孩
Child ch=new Child(i);
this.firstChild=ch;
this.temp=ch;
}else{
//创建最后一个小孩
if(i==len){
Child ch=new Child(i);
temp.nextChild=ch;
temp=ch;
temp.nextChild=this.firstChild; }else{
//继续创建小孩
Child ch=new Child(i);
//连接,搭桥
temp.nextChild=ch;
//temp向前走一步,指向刚刚进来的孩子
temp=ch;
}
}
}
}
//打印该环形链表
public void show(){
Child temp=this.firstChild;
do{
System.out.println(temp.no);
temp=temp.nextChild;
}while(temp!=this.fistChild); }
}
优化:
代码:
public class Demo{
public static void main(String[] args){
CycLink cyclink=new CycLink();
cyclink.setLen(50);
cycLink.createLink();
cycLink.setK(2);
cycLink.setM(3);
cyclink.show();
cyclink.play();
}
} //小孩
class Child{ //编号
int no;
//结点
Child nextChild=null;
public Child(int no){
//给编号
this.no=no;
}
} //环形链表
class CycLink{ //先定义一个指向链表第一个小孩的引用
//指定第一个小孩的引用不能动,不然以后找不到他了
Child firstChild=null;
//定义一个游标
Child temp=null;
//表示共有几个小孩
int len=0;
int k=0;
int m=0; //设置m
public void setM(int m){
this.m=m;
} //设置链表大小
public void setLen(int len){ this.len=len;
}
//设置从第几个人开始数数
public void setK(int k){
this.k=k;
}
//开始play
public void play(){
Child temp=this.fistChild;
//1.先找到开始数数的人
//int i=1;i<k;因为自己也要数一下,所以i不能为k
for(int i=1;i<k;i++){
temp=temp.nexChild;
}
while(this.len!=1){
//2.数m下
for(int j=1;j<m;j++){
temp=temp.nextChild;
}
//找到要出圈的前一个小孩,有待优化
Child temp2=temp;
while(temp2.nextChild!=temp){
temp2=temp2.nextChild;
}
//3.将数到m的小孩,退出圈
temp2.nextChild=temp.nextChild;
//让temp指向数数的小孩
temp=temp.nextChild;
this.len--;
}
//最后一个小孩(验证)
System.out.println(temp.no);
}
//初始化环形链表
public void createLink(){
for(int i=1;i<=len;i++){
if(i==1){
//创建第一个小孩
Child ch=new Child(i);
this.firstChild=ch;
this.temp=ch;
}else{
//创建最后一个小孩
if(i==len){
Child ch=new Child(i);
temp.nextChild=ch;
temp=ch;
temp.nextChild=this.firstChild; }else{
//继续创建小孩
Child ch=new Child(i);
//连接,搭桥
temp.nextChild=ch;
//temp向前走一步,指向刚刚进来的孩子
temp=ch;
}
}
}
}
//打印该环形链表
public void show(){
Child temp=this.firstChild;
do{
System.out.println(temp.no);
temp=temp.nextChild;
}while(temp!=this.fistChild); }
}
Josephu(约瑟夫)问题解析的更多相关文章
- Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)
1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...
- 数据结构与算法【Java】02---链表
前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...
- C#数据结构与算法系列(七):约瑟夫问题(Josephu)
1.介绍 Josephu问题为:设编号为1.2....n的n个人围坐在一圈,约定编号为k(1<=k<=n) 的人从1开始报数, 数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人 ...
- 简洁之美 -约瑟夫环的python 解法
问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...
- JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- php实现单,双向链表,环形链表解决约瑟夫问题
传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季 http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...
- PHP面试题及答案解析(5)—数据结构与算法
1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口) <?php class Test implements ...
- 深入理解Java虚拟机-类加载连接和初始化解析
不管学习什么,我一直追求的是知其然,还要知其所以然,对真理的追求可以体现在方方面面.人生短短数十载,匆匆一世似烟云,我认为,既然来了,就应该留下一些有意义的东西.本系列文章是结合张龙老师的<深入 ...
随机推荐
- 如何用kaldi做孤立词识别二
基本模型没有变化,主要是调参,配置: %WER 65% 下降到了 15% 后面再继续优化... Graph compilation finish!steps/decode.sh -- ...
- win10 系统下无法正常安装 Anaconda3
最近国庆两天,突然心血来潮重装了一遍系统,重装成了win10系统以后毛病百出哇,昨天和今天一直在解决一个问题,那就是安装Anaconda3的时候出现不了快捷方式,如下图这样只有一个快捷方式(在win7 ...
- FFmpeg 学习(七):FFmpeg 学习整理总结
一.FFmpeg 播放视频的基本流程整理 播放流程: video.avi(Container) -> 打开得到 Video_Stream -> 读取Packet -> 解析到 Fra ...
- C#不同窗体间数据传递
在做项目中经常会使用不同窗体之间的值,所以就有了传值的概念.最常见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道. 1. 如果很多窗体都需要用到某一窗体的东西,比如登录窗体记 ...
- Spring Boot Redis Cluster 实战干货
添加配置信息 spring.redis: database: 0 # Redis数据库索引(默认为0) #host: 192.168.1.8 #port: 6379 password: 123456 ...
- 解决Database returned an invalid datetime value. Are time zone definitions for your database installed?
设定博客文章按照时间分层筛选出现问题 ret=Article.objects.filter(user=user).annotate(month=TruncMonth("create_time ...
- SVN密码找回 完美方案
问题背景 SVN(Subversion)版本管理工具.本文以Windows操作系统下使用SVN的场景. 长时间不使用SVN,可能会出现忘记了SVN密码的尴尬局面.那么,该如何找回SV密码呢? 处理思路 ...
- C# 算法之选择排序
1.简介 选择排序是排序中比较简单的一种,实现的大致思路如下:首先我们拿到一个需要排序的数组,假设该数组的第一个元素是最小的,然后将数组中剩下的元素,于最小的元素进行比较,如果中间有比第一个元素的小的 ...
- mysql 导入 CSV文件命令行 ERROR 13 (HY000): Can't get stat of
一定要查看好CSV字段结构是否和文件的表结构字段一致 load data local infile 'F:/MySqlData/test1.csv' --CSV文件存放路径 into table st ...
- Android利用Intent与其他应用交互
前言: 上一篇博客给大家聊了Intent的定义,分类.属性和功能,相信大家对于Intent在Android中的作用已经清楚,这一篇博客将会给大家聊Intent的用法. Android系统的一个重要特性 ...