【C++】约瑟夫环问题:深度解析与高级优化
文章目录
- 💯前言
- 约瑟夫环问题:深度解析与高级优化
- 💯题目描述
- 💯解决方案详解
- 直接模拟法(基于 C++ 实现)
- 代码解析
- 示例执行过程
- 💯高级优化方法
- 数学递归公式
- 递归优化实现
- 性能对比
- 💯历史背景与实际应用
- 历史背景
- 实际应用
- 💯小结
💯前言
- 约瑟夫问题是一个横跨数学与计算机科学的经典挑战,蕴含了深刻的逻辑推理与
算法思想
。其核心在于如何高效解决一个看似简单的淘汰游戏,但其背后的递归特性和数据结构优化方法却极具启发性。这一问题不仅具有理论研究价值,更在操作系统调度
、加密算法设计、游戏开发
等实际应用中展现出独特的实用性。本文旨在通过多角度剖析约瑟夫问题,探索其基础解法与高级优化,并为读者提供深入理解此问题的全面视角。
C++ 参考手册
约瑟夫环问题:深度解析与高级优化
💯题目描述
约瑟夫问题(Josephus Problem),又称约瑟夫斯置换,是计算机科学和数学中一个广为人知的经典问题,其内核蕴含了深刻的递归思想与数据结构优化理念。在算法设计与分析的语境中,该问题亦被称为约瑟夫环(Josephus Circle)。
问题陈述:
设有一组人数为 ( n ) 的个体围成一个环形,每次从指定起点按照固定步长 ( k ) 报数,跳过 ( k-1 ) 人后处决第 ( k ) 个人。过程持续,直到仅剩一人为止。
目标:给定 ( n ) 和 ( k ),确定最后幸存者的编号。
实例:
10 个人(编号从 1 到 10)围成一个环,从编号为 1 的位置开始报数,每次跳过 5 个人后处决第 6 人。
最终问题:最后幸存者是谁?
输入与输出规范
输入描述
本问题未特定输入条件,假设均以函数参数形式提供:
- ( n ):初始环人数。
- ( k ):跳过人数。
输出描述
返回最后存活者的编号。
示例:
- 输入:
- 人数 ( n = 10 ),跳过人数 ( k = 5 )。
- 输出:
- 存活者编号为 3。
提示:以上仅为输出格式示意,实际问题答案可能因参数不同而异。
💯解决方案详解
直接模拟法(基于 C++ 实现)
以下提供一种朴素解法:
#include <iostream>
#include <vector>int josephus(int n, int k) {std::vector<int> circle; // 初始化环形队列for (int i = 1; i <= n; ++i) {circle.push_back(i);}int index = 0; // 从第一个位置开始while (circle.size() > 1) { // 环中人数大于 1index = (index + k - 1) % circle.size(); // 计算下一个淘汰者circle.erase(circle.begin() + index); // 淘汰该位置编号}return circle[0]; // 返回幸存者编号
}int main() {int n = 10;int k = 5;std::cout << josephus(n, k) << std::endl;return 0;
}
代码解析
- 初始化环形队列:用
std::vector<int>
模拟环形结构,存储 ( 1 ) 至 ( n ) 的编号。 - 淘汰规则:
- 当前报数起点为
index
。 - 通过公式
(index + k - 1) % circle.size()
确定下一个淘汰者的位置。
- 当前报数起点为
- 动态更新:每轮删除淘汰编号后,调整数组长度及索引。
- 终止条件:当环中仅剩一人时返回结果。
示例执行过程
- 初始环: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 1,2,3,4,5,6,7,8,9,10
- 首轮淘汰编号 5:新环 1 , 2 , 3 , 4 , 6 , 7 , 8 , 9 , 10 1, 2, 3, 4, 6, 7, 8, 9, 10 1,2,3,4,6,7,8,9,10
- 次轮淘汰编号 10:新环 1 , 2 , 3 , 4 , 6 , 7 , 8 , 9 1, 2, 3, 4, 6, 7, 8, 9 1,2,3,4,6,7,8,9
- 循环直至最终仅剩编号 3。
此方法具有直观性,但效率有限,其时间复杂度为 ( O(n^2) )。
💯高级优化方法
对于大规模问题,直接模拟法的效率难以满足实际需求。通过数学推导可实现递归优化。
数学递归公式
递归公式如下:
J ( n , k ) = { 1 当 n = 1 ( J ( n − 1 , k ) + k − 1 ) m o d n + 1 当 n > 1 J(n, k) = \begin{cases} 1 & \text{当 } n = 1 \\ (J(n-1, k) + k - 1) \mod n + 1 & \text{当 } n > 1 \end{cases} J(n,k)={1(J(n−1,k)+k−1)modn+1当 n=1当 n>1
递归优化实现
以下为递归解法代码:
#include <iostream>int josephus_recursive(int n, int k) {if (n == 1) {return 1;} else {return (josephus_recursive(n - 1, k) + k - 1) % n + 1;}
}int main() {int n = 10;int k = 5;std::cout << josephus_recursive(n, k) << std::endl;return 0;
}
性能对比
- 时间复杂度:递归方法通过线性迭代计算,总复杂度降为 ( O(n) )。
- 空间复杂度:栈调用深度为 ( O(\log n) ),适合大规模输入问题。
💯历史背景与实际应用
历史背景
约瑟夫问题源于犹太历史学家 Flavius Josephus 的故事。在被围攻的绝境中,约瑟夫与其同伴选择自尽,但通过精准的数学计算,他巧妙成为唯一幸存者。
实际应用
- 操作系统设计:用于时间片轮转调度策略模拟。
- 密码学:环形移位规则在数据加密中具有广泛应用。
- 游戏设计:淘汰机制和优先级排序常见于多人游戏。
- 资源调度:适用于动态分配资源的场景(如任务管理、队列服务)。
💯小结
本文从基础模拟到递归优化,全面剖析了约瑟夫问题的解法及其背后蕴含的算法思想。直接模拟法强调了动态数据结构操作的基本原理,而递归优化展示了数学与计算机科学的深度融合。该问题不仅具有学术价值,亦在工程实践中拥有广泛应用潜力。
约瑟夫问题教会我们,简单的问题背后可能隐藏着深刻的数学逻辑,而算法优化的过程本身则是技术与艺术的统一。
相关文章:
【C++】约瑟夫环问题:深度解析与高级优化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言约瑟夫环问题:深度解析与高级优化💯题目描述💯解决方案详解直接模拟法(基于 C 实现)代码解析示例执行过程 💯高级优…...
总结拓展十七:SAP 采购订单行项目“交货“页签解析
《 SAP采购订单行项目“交货”页签字段解析》 在 SAP 系统的采购流程中,采购订单行项目的“交货”页签承载着关键的信息,其中的字段更是对整个交货环节的精准描述和把控的重要元素。理解和正确解析这些字段,对于确保采购流程的顺利进行、优化…...
作业Day2: 多文件编译; 思维导图
目录 ①文件代码 及其所需头文件分析 main.c文件 1.h文件 1.c文件 ②运行结果: ③代码分析 结构体成员 数据类型的设定: 信息录入函数 信息删除 成绩排序 信息显示 自定义初始化函数 ④思维导图:编辑 ①文件代码 及其所需头文…...
Kioptrix Level 1通关攻略
目录 修改靶机Kioptrix:Level 1 的网络模式 探测靶机IP地址 得到端口信息 扫描TCP端口 扫描UDP端口 脚本扫描 指纹探测 漏洞探测 目录枚举扫描 发现利用脚本 执行exp链接shell 修改靶机Kioptrix:Level 1 的网络模式 Kioptrix: Level 1靶机的默认网络模式是桥接&#x…...
01 下载opencv并配置vs开发环境
01 下载opencv并配置vs开发环境 01 下载windows版本的opencv 下载地址:点击 WIndows版本的是编译好的代码。 当然国外网站下载很慢,可以通过我分享的网盘链接下载 opencv-4.10.0-windows.exe https://www.alipan.com/s/wV7z4YsmXgN 点击链接保…...
Ubuntu22.04 docker如何发布镜像(和用git差不多)
在dockerhub上创建远程仓库:https://hub.docker.com/ 将本地镜像打tag,并修改成可以上传到 dockerhub 的形式 # 查看本地镜像# 修改镜像 ## docker tag 镜像名称:标签 新的镜像名称(要和远程仓库dockerhub上的一致):新的标签pus…...
【Golang】——Gin 框架中的模板渲染详解
Gin 框架支持动态网页开发,能够通过模板渲染结合数据生成动态页面。在这篇文章中,我们将一步步学习如何在 Gin 框架中配置模板、渲染动态数据,并结合静态资源文件创建一个功能完整的动态网站。 文章目录 1. 什么是模板渲染? 1.1 概…...
React的局限性是什么?
性能: 虚拟 DOM 虽然提高了渲染性能,但在某些情况下可能会造成性能瓶颈,尤其是在处理大量数据或复杂更新时。对于非UI任务(如计算密集型操作),React 本身并不擅长。 学习曲线: 对于初学者来说&a…...
【Vulkan入门】09-CreateFrameBuffer
目录 先叨叨git信息关键代码VulkanEnv::FindHostVisitbaleMemoryTypeIndex()TestPipeLine::CreateFramebuffers() 与网上大多数文章不同,其他文章基本上都使用窗口框架(X11、GLFW、WSL等)提供的surface来显示Vulkan渲染出的图像。我认为那样会…...
罗技键鼠更换新台式机无蓝牙通过接收器安装
优联驱动下载: http://support.logitech.com.cn/zh_cn/software/unifying (下载安装后按照步骤一步步操作,匹配后即可使用) 向京东客服反馈后提供的驱动下载安装连接 有问题欢迎评论沟通~...
深入了解Modbus TCP协议:介绍、原理解析与应用示例
深入了解Modbus TCP协议:介绍、原理解析与应用示例 在工业自动化领域,设备之间的通信与数据交换至关重要。Modbus协议作为一种经典的通信协议,因其简单、开放和易于实现的特点,被广泛应用于各种工业设备之间的数据传输。而Modbus…...
vue2 项目中实现动态代理,服务器上通过nginx部署 实现动态代理
一、前言&&原理 前言:vue2 项目中,请求接口是从表格的当前获取的,也就是接口ip:端口号:路经不确定,要实现点击表格当前行请求对应的接口 实现原理:将实际要请求的ip等信息存在请求头中,用的时候再…...
OpenGL 几何着色器高级应用
几何着色器高级应用 概念回顾 几何着色器(Geometry Shader)是 OpenGL 管线中的可选着色器阶段,位于顶点着色器(Vertex Shader) 和光栅化阶段 之间。 其核心功能是基于输入的图元(如点、线或三角形),生成新的图元,或对输入的图元进行修改。 几何着色器的执行是以图元…...
QT JSON文件解析
参考博客 https://blog.csdn.net/cpp_learner/article/details/118421096 1 打开文件,读取全部内容 QFile file("../Json/js.json"); if (!file.open(QFile::ReadOnly | QFile::Text)) {qDebug() << "cant open error!";return; }// 读…...
c++中string字符串与其他类型的转换
一、string 转换成其他类型 1、转换为整数 使用std::stoi(适用于int)、std::stol(适用于long)、std::stoll(适用于long long)、std::stoul(适用于unsigned long)和std::stoull&…...
aws(学习笔记第十七课) SQS Amazon Simple Queue Service服务
aws(学习笔记第十七课) SQS Amazon Simple Queue Service服务 学习内容: 使用SQS Amazon Simple Queue Service服务整体代码(nodejs的通常工程)代码动作 1. 使用SQS Amazon Simple Queue Service服务 利用应用程序来学习SQS 创建S3$ aws s…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(8)
1.问题描述: 在AGC中,推送服务的消息回执新建成功后,有一个有效期 1,这个有效期是什么意思,过期后,会影响什么呢? 2,这个有效期是否可以修改成一直不过期? 解决方案&…...
mysql 的 binlog 原理
binlog的作用:binlog的三种格式Statement-Based Replication (SBR):Row-Based Replication (RBR):Mixed-Based Replication (MBR): 总结:如何选择:如何配置binlog? binlog的作用: 数据恢复: 如果mysql的数据丢失了,又没有备份数…...
Android显示系统(10)- SurfaceFlinger内部结构
一、前言: 之前讲述了native层如何使用SurfaceFlinger,我们只是看到了简单的API调用,从本文开始,我们逐步进行SurfaceFlinger内部结构的分析。话不多说,莱茨狗~ 二、类图: 2.1、总体架构: 先看下SurfaceFlinger的关键成员和我们BootAnimation侧关键成员如何对应起来…...
独家首发 | 基于多级注意力机制的并行预测模型
往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享! EMD变体分解效果最好算法——CEEMDAN(五)-CSDN博客 拒绝信息泄露!VMD滚动分…...
Burp suite2 (泷羽sec)
声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面,了解网络安全领域的见闻,了…...
npm或yarn包配置地址源
三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装:yarn install 注意…...
Referer头部在网站反爬虫技术中的运用
网站数据的安全性和完整性至关重要。爬虫技术,虽然在数据收集和分析中发挥着重要作用,但也给网站管理员带来了挑战。为了保护网站数据不被恶意爬取,反爬虫技术应运而生。本文将探讨HTTP头部中的Referer字段在反爬虫技术中的应用,并…...
Next.js授权管理教程:深入掌握Session管理
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 引言 1. Session管理的基本概念 1.1 什么是Session管理? 1.2 Session与Cookie 1.3 使用Session的优点 2. 在Next.js中管理Session 2.1 使用cookie存储Se…...
Python+OpenCV系列:滤波器的魔力
滤波器是图像处理领域中不可或缺的工具。无论是去除噪声、锐化图像还是提取特征,滤波器都扮演着重要角色。本篇将从简单到复杂,带你快速掌握 PythonOpenCV 中的滤波器使用技巧。 什么是滤波器? 滤波器是一种对图像像素值进行计算、平滑或增强…...
代码随想录算法训练营day41|动态规划买卖股票问题
今天的三题买卖股票问题,实际上解题方法都大同小异,思路也和昨天的树形dp有相似之处,都是用一个dp数组的不同下标来记录不同的状态。其中第一题是只买卖一次,可以用贪心的方法,找出左边的最小值和右边的最大值…...
【EthIf目录】EthIf的文件结构
ls -R 查看目录EthIf的文件结构,包含四个目录, 一个make file文件,具体如下所示:...
Spring 面试题整理
文章目录 一、控制反转 IoC什么是 Bean 和 Spring Bean?依赖注入的常见方式?Bean 的作用域有哪些?protype bean 里面的依赖是 singleton bean 的话,IoC 容器会怎么处理?Bean 的生命周期?Resource 和 Autowi…...
Converting circular structure to JSON
最近在项目中遇到了这个问题,头疼,弄了一下午才解决。做一个笔记吧。 1 Converting circular structure to JSON 我这个问题大致就是在使用pinia中出现了循环引用,意思是两个或多个模块、对象或依赖之间形成了相互依赖的链条。在使用 Pinia…...
webstorm开发uniapp(从安装到项目运行)
1、下载uniapp插件 下载连接:Uniapp Tool - IntelliJ IDEs Plugin | Marketplace (结合自己的webstorm版本下载,不然解析不了) 将下载到的zip文件防在webstorm安装路径下,本文的地址为: 2、安装uniapp插…...
企业级包管理器之搭建 npm 私有服务器 (6)
在企业级应用开发中,常常需要处理私有包的发布和管理。搭建 npm 私有服务器是一个理想的解决方案,它不仅能保证代码的私密性,还能提供更快的下载速度和更精细的权限设置。 一、搭建 npm 私有服务器的优势 保证代码私密性:在企业…...
会议通知:人工智能通识教育与实践发展暨和鲸科技AI通识课解决方案发布会
今年秋季学期起,全国多所高校面向本科生开设人工智能通识课。 当前人工智能通识课程的建设进展主要分为三种情况: 全市统筹,由某头部高校牵头建设市级人工智能通识课,以北京市、天津市为代表; 已于秋季学期按照课程…...
windows C#-自动实现属性的轻型类
此示例演示如何创建一个不可变的轻型类,该类仅用于封装一组自动实现的属性。 当你必须使用引用类型语义时,请使用此种构造而不是结构。 可通过以下方法来实现不可变的属性: 仅声明 get 访问器,使属性除了能在该类型的构造函数中…...
汽车零部件设计之——发动机曲轴预应力模态分析仿真APP
汽车零部件是汽车工业的基石,是构成车辆的基础元素。一辆汽车通常由上万件零部件组成,包括发动机系统、传动系统、制动系统、电子控制系统等,它们共同确保了汽车的安全、可靠性及高效运行。在汽车产业快速发展的今天,汽车零部件需…...
C#基础:结构
目录 1. C# 程序结构 示例: 2. 变量和数据类型 示例: 3. 控制结构 条件语句(if): 循环语句(for 和 while): 4. 函数定义和调用 示例: 5. 数组和集合 数组示例…...
[免费]SpringBoot+Vue疫苗接种预约管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue疫苗接种预约管理系统,分享下哈。 项目介绍 如今的时代,是有史以来最好的时代,随着计算机的发展到现在的移动终端的发展,国内目前信息技术已经在…...
C++50道经典面试题
文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 导读 作为一种通用且面向对…...
iptables详解
华子目录 什么是防火墙分类netfilter(数据包过滤)定义netfilter分析内容 防火墙无法完成的任务netfilter策略管理工具netfilter的5类hook函数防火墙规则策略匹配原则iptablesiptables流量处理动作iptables表5种规则表 安装iptablesiptables策略文件 ipta…...
静态链表的构建
前言: 静态链表的概述: 静态链表是一种在数组中模拟链表结构的数据结构,它通过数组的索引来模拟指针,实现节点之间的链接,就不需要使用指针了。每个节点由两部分组成:数据域和游标。数据域用于储存数据&a…...
python3中的身份运算符
一. 简介 本文简单学习一下,python3中的身份运算符。 在Python 3中,身份运算符用于比较两个对象的身份,即它们是否引用内存中的同一个对象。 二. python3 中的身份运算符 1. python3 中的身份运算符 python3 中的身份运算符如下表所示&a…...
Java泛型设计详解
引言 在日常Java开发中,泛型是一个非常重要的特性。它提供了编译时的类型安全检查,增强了代码的可读性和可维护性。然而,对于初学者甚至一些有经验的开发者来说,泛型的使用和理解仍然是一个挑战。本文旨在深入探讨Java泛型的诞生…...
第十九章程序清单合集——Java语言程序设计进阶篇(黑皮书)
目录 程序清单19_1GenericStack 程序清单19_2GenericMethodDemo 程序清单19_3BoundedTypeDemo 程序清单19_4GenericSort 程序清单19_5Max 程序清单19_6MaxUsingGenericType 程序清单19_7wildCardNeedDemo 程序清单19_8AnyWildCardDemo 程序清单19_9SuperWildChardDem…...
el-table组件树形数据修改展开箭头
<style lang"scss" scoped> ::v-deep .el-table__expand-icon .el-icon-arrow-right:before {content: ">"; // 箭头样式font-size: 16px; }::v-deep .el-table__expand-icon{ // 没有展开的状态background-color: rgba(241, 242, 245, 1);color:…...
LabVIEW前面板无法显示的常见原因
当 LabVIEW 前面板显示为白色或黑色时,可能由于控件可视性设置、显卡驱动问题、程序错误或 LabVIEW 设置不当引起。通过检查面板设置、更新驱动、重启程序等方式可有效解决此问题。 遇到前面板无法显示或显示为白色/黑色的情况,可能有以下几种原因。可以…...
PyQt事件机制练习
一、思维导图 二、代码 import sysfrom PyQt6.QtTextToSpeech import QTextToSpeech from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit from PyQt6 import uic from PyQt6.QtCore import Qt, QTimerEvent, QTimeclass MyWidget(QWidget):d…...
Android 中,Activity Fragment:如何进行界面跳转、数据传递等
学习笔记 1. Activity 之间的界面跳转和数据传递 在 Android 中,Activity 之间的跳转通常通过 Intent 来完成。Intent 可以携带数据,并传递给目标 Activity,也可以从目标 Activity 返回数据。 从一个 Activity 跳转到另一个 Activity // 在…...
【ubuntu18.04】安装easycwmp出现/usr/bin/ld: cannot find -lubus问题解决方案
错误日志 rootw1804-virtual-machine:/opt/dev/easycwmp# make Making all in bin make[1]: Entering directory /opt/dev/easycwmp/bin gcc -DPACKAGE_NAME\"easycwmpd\" -DPACKAGE_TARNAME\"easycwmpd\" -DPACKAGE_VERSION\"1.8.6\" -DPACKAG…...
可视化建模以及UML期末复习----做题篇
一、单项选择题。(20小题,每小题2分,共40分) 1、UML图不包括( ) A、用例图 B、状态机图 C、流程图 D、类图 E、通信图 答案:C、流程图 UML中不包括传统意义上的流程图,流程图通常是指B…...
【2024年浙江工商大学程序设计竞赛新生赛(同步赛)部分题解】
比赛链接 C. 交换 题目大意 给定一个长度为 n n n 的数组 a a a。一开始你有一个总和 s 0 s 0 s0。 现在你需要做 n n n 次操作,第 i i i 次操作的流程如下( 1 ⩽ i ⩽ n 1 \leqslant i \leqslant n 1⩽i⩽n): 选择一个下标 p ∈…...
[SAP ABAP] DEBUG ABAP程序中的循环语句
在ABAP程序开发中可能会遇到要DEBUG循环语句的情况,这个循环语句可能会执行上万次,但我们希望程序执行循环到100次就停下来,也就是希望DEBUG断点设置在循环语句的第100次停下来观察执行的结果,这时我们可以在DEBUG程序时通过设置一…...