约瑟夫和逆波兰求值试题.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
HUNAN UNIVERSITY 数据结构 实验报告 题 目: 约瑟夫环问题 学生姓名 梁天 学生学号 201408010318 专业班级 计科1403 指导老师 李晓鸿 日 期 2016.04.16 实验题目: 实验1 约瑟夫环问题 背景 约瑟夫问题(Josephus Problem)据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。 原题: 用户输入M,N值,N个人围成一个环,从0号人开始数,数到M,那个人就退出游戏,直到最后一个人求最后一个剩下的人是几号? 问题描述 设编号为1-n的n(n0)个人按顺时针方向围成一圈.首先第1个人从1开始顺时针报数.报m的人(m 为正整数).令其出列。然后再从他的下一个人开始,重新从1顺时针报数,报m的人,再令其出列。如此下去,直到圈中所有人出列为止。求出列编号序列。 基本要求 需要基于线性表的基本操作来实现约瑟夫问题 需要利用数组来实现线性表 输入输出格式 输入格式:n,m 输出格式1:在字符界面上输出这n个数的输出序列 输出格式2:将这n个数的输出序列写入到文件中 测试用例 输入:10,3 输出:3 6 9 2 7 1 8 5 10 4 选做内容 (1) 使用单链表来实现之 (2) 使用循环链表来实现之 课后习题 请以O(n)的时间复杂度来实现约瑟夫问题。 1.算法的基本思想: 这个问题可以用类似循环链表的数组来解决问题,每遇到第m个数,就把这个数输出并且把这个数删除。要把第m个数找到,我的解决思路就是先对n个人从1~n编号,然后用一个计数器t对检索次数计数,每次计数器t增加了m个数的时候,数组对应位置上的数据就是要出列的那个人,然后把这个人的编号输出,再从这个位置开始把数组后面的数到都前移一个位置,即达到删除效果,数组遍历到尾部的时候就重新将位置置0,从头开始,但是计数器继续计数,直到数组全部输出;简单的说:就是数组元素跟随着计数器增加,但是达到数组尾部就返回数组头部,计数器下一个计数对应数组头部,遍历到数组长度为0即结束。 2.程序设计的流程: 1.定义一个足够容量的空数组,然后从键盘输入约瑟夫环的总人数n和出列位置m。 2.对数组从0~n-1对数组赋值,第0个位置赋值1,第1个位置赋值2,依次类推,即实现编号功能; 3.开始循环检索,循环结束条件是剩余人数大于0,检索次数为m的整数倍,就将对应数组位置的元素值输出,然后删除这个位置的值,更新剩余人数rest的值,数组检索到尾部就从头继续检索,计数器一直计数; 关键代码分析: if(m =0 ||n = 0) cout wrong input endl; 这是对输入的人数和出列条件的预判断,不符合直接输出错误信息; for(i=0;in;i++) a[i]=i+1; 这是对数组编号,模拟n个人的编号位置; while(rest 0)//循环进行条件为剩余人数大于0 { t++;//计数器 if(t %m ==0)//出列位置判断 { cout a[index] ;//输出对应位置的编号; for(i = index;i rest-1;i++)//删除出列的人 a[i] = a[i+1]; index--;rest--;//更新剩余人数 } if(index rest-1)//数组模拟循环链表的设计,到尾部即返回开头 index++; else index=0; 时空分析: 这个程序中主要是寻找人的部分和删除对应人的编号元素部分需要耗费比较多的时间,时间复杂度为O(n2);空间主要是一开始配数

文档评论(0)

***** + 关注
实名认证
内容提供者

我是自由职业者,从事文档的创作工作。

1亿VIP精品文档

相关文档