约瑟夫环问题【算法 06】

news2024/9/23 11:24:33

约瑟夫环问题

请添加图片描述

约瑟夫环(Josephus Problem)是一个经典的数学和计算问题,其核心是解决在一群人围成一圈,每隔一定人数就淘汰一个人,最后剩下的那个人的编号。

问题描述

假设有 ( n ) 个人围成一圈,从第一个人开始报数,每次报到第 ( k ) 个人时,他就会被淘汰出局,然后从下一个人重新开始报数。如此循环,直到只剩下最后一个人。我们需要求出最后这个人最初的编号。

递归解法的推导

为了找到最后剩下的那个人的编号,我们可以使用递归来分析。

  1. 当只有一个人时( ( n = 1 )),无论从哪儿开始报数,剩下的肯定是这个人,因此有:
    J ( 1 , k ) = 0 这里的 0 是从编号为 0 的位置开始数。 J(1, k) = 0这里的 0 是从编号为 0 的位置开始数。 J(1,k)=0这里的0是从编号为0的位置开始数。

  2. 对于 ( n > 1 ) 的情况,假设已经知道 ( n-1 ) 个人时,最后剩下的那个人的编号为 ( J(n-1, k) )。那么当有 ( n ) 个人时,第 ( k ) 个人会被淘汰出局,圈中剩下的 ( n-1 ) 个人的问题就变成了一个小规模的约瑟夫问题。

    由于环形结构的特点,( n ) 个人变成 ( n-1 ) 个人后,编号会发生变化。因此,递推关系式为:
    J ( n , k ) = ( J ( n − 1 , k ) + k ) % n J(n, k) = (J(n-1, k) + k) \% n J(n,k)=(J(n1,k)+k)%n

  3. 最后,我们通过迭代的方式,从 ( n = 1 ) 开始逐步求解,最终得到 ( n ) 个人时最后剩下的人的编号。

通式总结

根据递归公式,我们可以归纳出通式:

J ( n , k ) = ( J ( n − 1 , k ) + k ) % n J(n, k) = (J(n-1, k) + k) \% n J(n,k)=(J(n1,k)+k)%n

C语言实现

根据上述递归公式,我们可以通过循环来实现约瑟夫问题的解法,避免递归调用的栈开销。

#include <stdio.h>

// 约瑟夫环问题解法
int josephus(int n, int k) {
    int result = 0; // 当只有一个人时,编号为0
    for (int i = 2; i <= n; i++) {
        result = (result + k) % i;
    }
    return result;
}

int main() {
    int n = 7; // 总人数
    int k = 3; // 每隔k个人淘汰一个
    printf("最后剩下的人的编号是:%d\n", josephus(n, k));
    return 0;
}

代码解释

  1. josephus 函数:使用一个循环来逐步计算从 ( 2 ) 个人到 ( n ) 个人时,最后剩下的人的编号。初始时,只有一个人时( ( n = 1 )),编号为 0。
  2. main 函数:定义了一个实例问题,设置 ( n = 7 ) 和 ( k = 3 ),并调用 josephus 函数求解。

复杂度分析

该算法的时间复杂度为 ( O(n) ),因为我们需要迭代 ( n-1 ) 次来计算最终的结果。空间复杂度为 ( O(1) ),因为只使用了常量级别的额外空间。

总结

通过递归分析和迭代优化,约瑟夫环问题可以通过 ( O(n) ) 时间复杂度来解决。该问题不仅在计算机科学中有重要的应用,也是一个经典的数学模型问题。

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

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

相关文章

负载调制平衡放大器LMBA理论分析与ADS理想架构仿真

负载调制平衡放大器LMBA理论分析与ADS理想架构仿真 负载调制平衡放大器Load Modulation Balanced PA&#xff0c;简称LMBA是2016年Cripps大佬分析实践的&#xff1a; An Efficient Broadband Reconfigurable Power Amplifier Using Active Load Modulation 本文ADS工程下载链…

回顾MVC

Tomcat是servlet的容器,想用HttpServlet需要导入tomcat jar包 下图是没用springmvc时的场景&#xff0c;首先在web.xml里面配置访问路径为/Hello然后 通过get请求去调用login方法最后重定向到index.jsp中 index.jsp里面的内容 重定向到index.jsp中 在控制台获取到username里面的…

考研数学|强化速成!1000/660/880题重点刷哪本?

马上9月了&#xff0c;还在纠结做什么题吗&#xff0c;1000/660/880&#xff0c;这几本习题册都不错。我的建议是选一本主力习题册660。其中1000和880题都可以作为主力习题册&#xff0c;而660题专门考察客观题&#xff0c;可以作为辅助习题册来做。该怎么选呢&#xff1f;如果…

pytorch深度学习基础 8(简单的神经网络替换线性模型)

接上一节的思路&#xff0c;这一节我们将使用神经网络来代替我们的之前的线性模型作为逼近函数。我们将保持其他的一切不变&#xff0c;只重新定义模型&#xff0c;小编这里构建的是最简单的神经网络&#xff0c;一个线性模块&#xff0c;一个激活函数&#xff0c;然后一个线性…

8月25日笔记

IOX的使用 iox是一款功能强大的端口转发&内网代理工具&#xff0c;该工具的功能类似于lcx和ew&#xff0c;但是iox的功能和性能都更加强大。 实际上&#xff0c;lcx和ew都是非常优秀的工具&#xff0c;但还是有地方可以提升的。在一开始使用这些工具的一段时间里&#xff…

8月26日星期一今日早报简报微语报早读

8月26日星期一&#xff0c;农历七月廿三&#xff0c;早报微语早读。 1、中国战队EDG获得2024无畏契约全球冠军赛总冠军&#xff1b; 2、亚洲首例猴痘Ib变异病例出现&#xff0c;可通过飞沫传播&#xff1b; 3、三文鱼刺身隔夜返包销售 胖东来&#xff1a;奖励投诉者10万&…

第15届蓝桥杯青少组Scratch初级组省赛真题试卷

第十五届蓝桥杯青少组省赛Scratch初级组真题试卷 题目总数&#xff1a;10 总分数&#xff1a;360 选择题 第 1 题 单选题 Scratch运行以下程序&#xff0c;角色会说( )? A.29 B.31 C.33 D.35 第 2 题 单选题 scratch运行下列哪个程序后&#xff0c;宇航…

windows安全软件之火绒杀毒的密码忘记后处理

一、问题描述 某次&#xff0c;想升级系统补丁&#xff0c;但多次尝试后都失败&#xff0c;排查杀毒软件影响过程中&#xff0c;发现火绒杀毒配置了密码保护&#xff0c;但因时间太久&#xff0c;密码已无从考证&#xff0c;那我们应该怎样处理这种情况呢&#xff1f; 二、处…

机器学习课程学习周报九

机器学习课程学习周报九 文章目录 机器学习课程学习周报九摘要Abstract一、机器学习部分1.1 Word Embedding1.1.1 词嵌入的基本概念1.1.2 word2vec连续词袋模型CBOW1.1.3 word2vec跳字模型Skip-gram 1.2 Transformer代码实践DatasetDataloaderModelLearning rate scheduleModel…

C++STL之list的使用详解

一、简介 1、底层&#xff1a;list为双向链表&#xff0c;即struct中包含一个数据和两个指针&#xff0c;分别指向前一个节点和后一个节点&#xff0c;在堆上分配空间&#xff0c;每插入一个元数都会分配空间&#xff0c;每删除一个元素都会释放空间 2、性能 ① 访问&#x…

C++语言学习(八)—— 继承、派生与多态(二)

目录 一、多继承 1.1 多继承中的二义性问题 1.2 虚基类 二、多态 2.1 静态绑定与静态多态 2.2 动态绑定与动态多态 三、运算符重载 3.1 重载、- -运算符 3.2 重载赋值运算符 3.3 重载输出流<<、输入流>>运算符 3.3.1 重载输出流&#xff08;<<&am…

VirtualBox下安装Centos7.9虚拟机的踩坑记录

目录 0 背景1 安装Centos7.91.1 下载iso镜像1.2 正常安装虚拟机1.3 将用户添加到sudoers并免密1.4 更新yum源1.5 配置静态IP1.6 通过ssh工具传文件1.7 总结 0 背景 最近搞了个便宜的低配台式机用来敲代码&#xff0c;主要是嫌弃笔记本屏幕太小了&#xff0c;想用个大屏。 然后我…

129页《战略推演:获取竞争优势的思维与方法》

知识星球APP搜索【战略咨询文库】&#xff0c;下载700多份资料 一、战略思维 差异化战略 产品或服务差异化&#xff1a;通过提供独特的产品特性、功能、设计或品质&#xff0c;满足特定客户群体的需求&#xff0c;从而与竞争对手区分开来。例如&#xff0c;苹果公司以其创新…

LeetCode 面试经典 150 题回顾

目录 一、数组 / 字符串 1.合并两个有序数组 &#xff08;简单&#xff09; 2.移除元素 &#xff08;简单&#xff09; 3.删除有序数组中的重复项 &#xff08;简单&#xff09; 4.删除有序数组中的重复项 II&#xff08;中等&#xff09; 5.多数元素&#xff08;简单&am…

数据结构与算法的实现与优化

目录 引言 数据结构与算法的重要性 实现与优化的基本原则 线性表的实现 顺序表与链表的实现 静态链表与动态链表的对比 栈与队列的实现 顺序栈与链栈的实现 顺序队列、链队列、循环队列与双端队列的实现 高级树结构的实现 二叉树、平衡树与哈夫曼树的实现 图的实现…

SSRF——redis(未授权访问)①

本文介绍如何复现并利用Redis的未授权访问漏洞&#xff0c;以达到远程代码执行和获取系统权限的目的。Redis版本&#xff08;2.8&#xff09;&#xff0c;于Ubuntu环境下进行。 SSRF&#xff08;Server-Side Request Forgery&#xff09;是一种网络安全漏洞&#xff0c;允许攻击…

前端实现两张图片合成,图片换背景,简单p图程序

前言 最近在自己做一个图文工具网站&#xff0c;图片背景替换功能&#xff0c;后台通过opencv的AI算法抠出了图片主元素&#xff0c;现在需要把抠出来的元素换一个背景色&#xff0c;或者合成到一张背景图片中&#xff0c;如何操作呢&#xff1f; 实现方式Demo 我考虑的是…

linux系统使用 docker 来部署运行 mysql5.7 并配置 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…

【解决问题】linux系统运行程序可以打印信息到屏幕,重定向到一个文件,文件中没有信息

在Linux系统中运行程序时&#xff0c;如果你发现程序打印的信息无法通过重定向写入到文件中&#xff0c;那么很可能是因为程序将信息打印到了标准错误流&#xff08;stderr&#xff09;&#xff0c;而不是标准输出流&#xff08;stdout&#xff09;。重定向操作通常只对标准输出…

20240826 每日AI必读资讯

突发&#xff01;IBM中国研发岗访问权限一夜关闭&#xff0c;千人或被裁 - IBM中国区一夜关闭了研发测试岗员工的内部权限&#xff0c;波及1000多名员工。 - 今年3月&#xff0c;IBM大中华区董事长陈旭东在媒体及分析师沟通会上表示&#xff0c;公司在IBM大中华区的战略将聚焦…