对约瑟夫问题的进一步思考

news2024/10/6 0:29:00
  1. 约瑟夫问题重述

在计算机编程的算法中,类似问题又称为约瑟夫环

约瑟夫环:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。

例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。

如图所示

2.约瑟夫问题递归法计算原理

2.1 内容:设F(N,M)为最后存活者的位置(位置从0开始),则有:

F(N,M)=(F(N-1,M)+M)%N

​​​​​​​2.2 证明:数学归纳法

·  当n=1时,f(1,m)=0,因为编号从0开始且只有一个人,胜利者编号显然为0。 当n=2时,序列为0,1,若m为奇数,则胜利者编号为1;若m为偶数,则胜利者编号为0,易有f(2,m)=m%2=(0+m)%2=[f(1,m)+m]%2,结论成立。

·  假设当n=i-1时结论成立,即对于序列0,1,2,...,i-2而言,最后的胜利者编号为f(i-1,m)。 当n=i时,序列为0,1,2,...,i-1。设第一轮的淘汰者编号为k(若m%i=0,则k=i-1,否则k=m%i-1),则序列可表示为0,1,2,...,k-1,k,k+1,...,i-1。第一轮淘汰k,余下的序列x'为k+1,...,i-1,0,1,...,k-1,问题规模变为i-1。 因为由归纳假设,当n=i-1时,对于序列x:0,1,2,...,f(i-1,m),...,i-2,胜利者编号为f(i-1,m)。

由于x'=(x+k+1)%i,故f(i,m)=[f(i-1,m)+k+1]%i。当m%i=0时,k+1=i,[f(i-1,m)+k+1]%i=[f(i-1,m)+i]%i=f(i-1,m)%i+0=f(i-1,m)%i+m%i=[f(i-1,m)+m]%i;当m%i!=0时,k+1=m%i,[f(i-1,m)+k+1]%i=[f(i-1,m)+m%i]%i=[f(i-1,m)+m]%i。故当n=i时,结论成立。

· 综上,命题成立。

3.设计对象问题

3.1问题重述:

假设你正在游玩约瑟夫游戏,从你开始报数,游戏规则与课上讲述一致,现在你想确保你是最后一个出列的玩家,如果由你设置m(即每报几个数出列一人),你应该如何设置m来确保自己的胜利?

3.2问题分析:

  1. F(N,M)=(F(N-1,M)+M)%N
  2. 设“我”的编号为S,总人数为N,每次第M个人被杀掉,S,N为已知量,M是待确定量;
  3. 最终目标:在保证F(N,M)+ S = S的条件下,确定M;
  4. 在确保时间复杂度,计算的开销等因素下,尽量进行优化的选取。

3.3问题求解:

F(N , M) = (F(N-1,M)+M) mod  N    (1)

F(N , M) = 0; ( 2 )

思路1:枚举法

1.实现:枚举m,运用公式计算F(N,M) , 找到满足条件的m;

2.复杂度:O(n*m);

3.优点: 思路简单,枚举足够多就能找到全部解,且容易。

4.缺点:用while()枚举,当大到一定程度终结。无法确定是否能找到m,以及m要枚举多大。

思路2:设计法

  1. 实现:

F(1,M) = 0;

F(2,M) = (M)%2 = 0;

F(3,M) = (M%2 +M)%3 = 0 ;

...

F(N,M) = (M%2 + M%3 + M%4 +...+M%N)%N = 0;

令 M = N!,则满足条件。

2.复杂度:O(N);

3.优点: 复杂度低

4.缺点:当N过大时,m数据值过大。 

6.优化

1.操作:

双指针删因子法缩小m规模。

试图在不改变复杂度条件下删除公共因子以减小m的数据规模。

  1. 复杂度: O(N);
  2. 缺陷:降低规模效果不明显,依旧只能处理小范围数据
  3. 进一步优化:
  4. 方法1:用string进行大数计算;
  5. 方法2:用Python;
  6. 方法3:n小则用法2,n大用法1,但是依旧具有m不确定是否能找到的不稳定性。

只需在原有基础上修改为大数模式,在此除了方法三外不做具体实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gRPC vs REST:创建API的方法比较

本文对gRPC和REST的特征和区别进行了介绍,这可能是当今创建API最常用的两种方法。 文章目录 一、gRPC的介绍 二、什么是REST? 三、什么是gRPC? 四、gRPC和REST的比较 (1)底层HTTP协议 (2)支持的数据…

实现C++多线程的完全指南

目录 引言:1. 理解多线程编程的基本概念2. 引入C标准库中的线程库3. 创建线程4. 线程同步和互斥5. 线程间的通信使用多线程需要关注的要点结论: 引言: 在现代软件开发中,多线程编程已经成为一项非常重要的技能。通过利用多线程&a…

前后端分离------后端创建笔记(07)表单验证

1、我输入数据,然后关闭,重新打开会发现残存的数据仍然保留着 2、点了这个x号,数据就全部被清理了 3、点这三个地方,数据全部都清理掉 4、这里先写一个方法 4.1 定义一个方法 4.2 这里表单的数据在哪里,就是这个 4.3 …

最新Kali Linux安装教程:从零开始打造网络安全之旅

Kali Linux,全称为Kali Linux Distribution,是一个操作系统(2013-03-13诞生),是一款基于Debian的Linux发行版,基于包含了约600个安全工具,省去了繁琐的安装、编译、配置、更新步骤,为所有工具运行提供了一个…

无监督学习之主成分分析-半导体制造高维数据如何降维

数据降维不只存在于半导体数据中,它是存在于各行各业的,我们要分析的数据维数较多的时候全部输入维数较大这时就要采取降维的方法综合出主要的几列用于我们的分析。 PCA的哲学理念是要抓住问题的主要矛盾进行分析,是将多指标转化为少数几个…

13 docker使用问题

目录 docker模块分布: ①:安装"abseil"C库 ②:安装CMake​编辑 ③:grpc安装 ④:protobuf安装​编辑 ⑤:qt界面显示 ⑥:dockerfile编写​编辑 ⑦:执行docker脚本 …

(隐性)类型转换和算数转换

类型转换(char,short) 几个char 类型或者short 类型的数相加,会把他们提升为整形来相加 整型提升的意义: 表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长…

开学触控笔买哪个牌子好?ipad可以用的电容笔推荐

随着开学时间的临近,各大学院的学生们也都陆陆续续为走进校园而做准备了。那么开学自然需要买一些必要的数码电子产品,比如搭配iPad使用的电容笔。我们究竟要不要买苹果原装电容笔?事实上,如果只是为了写字记录东西的话&#xff0…

python爬虫数据解析xpath、jsonpath,bs4

数据的解析 解析数据的方式大概有三种 xpathJsonPathBeautifulSoup xpath 安装xpath插件 打开谷歌浏览器扩展程序,打开开发者模式,拖入插件,重启浏览器,ctrlshiftx,打开插件页面 安装lxml库 安装在python环境中的Scri…

windows11下配置vscode中c/c++环境

本文默认已经下载且安装好vscode,主要是解决环境变量配置以及编译task、launch文件的问题。 自己尝试过许多博客,最后还是通过这种方法配置成功了。 Linux(ubuntu 20.04)配置vscode可以直接跳转到配置task、launch文件,不需要下载mingw与配…

C#_字符串

String类型 字符串是信息最重要载体,相对于图像、语音、视频更易读易处理;C#字符串具有 不可变 特征, 从使每一次修改都要需要申请内存空间,并且需要复制源字符串到新的内存空间,还要需要销毁原有空间。 优势&#x…

前端实现文件预览功能

前端实现文件预览功能 ❝ 需求:实现一个在线预览pdf、excel、word、图片等文件的功能。 介绍:支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代码实现所有功能,建议以下的预览文件标签可以在外层包裹一层弹窗。 ❞ 图片预览 iframe标签…

详细安装配置django

安装配置使用Django。 1,下载安装 django pip install django 2.创建设置项目 先进入要放置项目的文件夹下 2.1, 创建项目 django-admin startproject Api_project 2.2, 创建app命令 cd Api_project dir看一下是否有 manage.py 文件…

ORB-SLAM2第五节---局部地图跟踪(阶段二)

保证三种跟踪方式更加准确 1.局部关键帧 当前帧F的局部关键帧包括: 能够观测到当前帧F中地图点的共视关键帧KF1、KF2,称为一级共视关键帧。一级共视关键帧的共视关键帧(前10个共视程度最高的关键帧),比如图中的KF1的…

取证--实操

2022年美亚杯个人赛 运用软件DB Browser for SQLite (一款用于查看SQLlite数据库文件的浏览器工具) 火眼,盘古石手机取证系统等 案件详情 于2022年10月,有市民因接获伪冒快递公司的电邮,不慎地于匪徒架设的假网站提…

分类预测 | MATLAB实现CNN-BiGRU-Attention多输入分类预测

分类预测 | MATLAB实现CNN-BiGRU-Attention多输入单输出分类预测 目录 分类预测 | MATLAB实现CNN-BiGRU-Attention多输入单输出分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现CNN-BiGRU-Attention多特征分类预测,卷积双向门控循环…

qemu简单使用

参考: 记一次全设备通杀未授权RCE的挖掘经历 claude1 安装使用 附件下载 下载后拖到虚拟机 解压 使用root用户 运行.sh脚本即可 运行脚本解读 #!/bin/bashsudo qemu-system-mipsel \-cpu 74Kf \-M malta \-kernel vmlinux-3.2.0-4-4kc-malta \ -hda debian…

Rabbitmq延迟消息

目录 一、延迟消息1.基于死信实现延迟消息1.1 消息的TTL(Time To Live)1.2 死信交换机 Dead Letter Exchanges1.3 代码实现 2.基于延迟插件实现延迟消息2.1 插件安装2.2 代码实现 3.基于延迟插件封装消息 一、延迟消息 延迟消息有两种实现方案&#xff…

PyQt5下拉列表实现及信号与槽的连接

目录 1、常用方法 2、常用信号 3、实操 1、常用方法 QComboBox() 创建一个下拉框对象addItems 可以使用列表进行多个下拉框内容添加, 单个添加用addItemcurrentIndexChanged 是用来获取当前选择下拉框的索引, 这也是这个"信号"槽函数需要 有个索引传参, 这样就便…

优化查询性能:UNION与UNION ALL的区别

作用 在SQL查询中,当我们需要合并多个查询结果集时,我们通常会使用UNION和UNION ALL操作符,同时,如果你写的or语句不走索引,可以考虑使用UNION、UNION ALL优化。 在本篇博客中,我们将探讨UNION和UNION AL…