php使用环形链表解决约瑟夫问题完整示例


Posted in PHP onAugust 07, 2018

本文实例讲述了php使用环形链表解决约瑟夫问题。分享给大家供大家参考,具体如下:

约瑟夫问题:

Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。并求出最后出列的人是哪个?

PHP实现环形链表以及约瑟夫问题的解决:

/**
 * 链表结构
 */
class Child{
  public $no;
  public $next=null;
  public function __construct($no=null){
    $this->no = $no;
  }
}
/**
 * 链表操作
 */
class CycleLink{
  private $nodeNum = 0;
  /**
   * 添加节点
   */
  public function addNode($head,$node)
  {
    $currentNode = $head;
    while ($currentNode->next!=null && $currentNode->next!=$head) {
      $currentNode = $currentNode->next;
    }
    $currentNode->next = $node;
    $currentNode->next->next = $head;
    $this->nodeNum++;
  }
  /**
   * 删除节点
   */
  public function delNode($head,$no)
  {
    $currentNode = $head;
    while ($currentNode->next!=$head) {
      if($currentNode->next->no==$no){
        $currentNode->next = $currentNode->next->next;
        $this->nodeNum--;
        break;
      }
      $currentNode = $currentNode->next;
    }
  }
  /**
   * 获取节点数量
   */
  public function getNodeNum(){
    return $this->nodeNum;
  }
  /**
   * 查找节点
   */
  public function findNode($head,$no){
    $node = null;
    $currentNode = $head;
    while ($currentNode->next!=$head) {
      if($currentNode->next->no==$no){
        $node = $currentNode->next;
        break;
      }
      $currentNode = $currentNode->next;
    }
    return $node;
  }
  public function getNextNode($head,$node){
    if($node->next==$head){
      return $node->next->next;
    }
    return $node->next;
  }
  /**
   * 显示节点
   */
  public function showNode($head)
  {
    echo "<br/><br/>";
    $currentNode = $head;
    while ($currentNode->next!=$head){
      $currentNode = $currentNode->next;
      echo '第 '.$currentNode->no.' 名小孩<br/>';
    }
  }
}
/*
//创建一个head头,该head 只是一个头,不放入数据
$head     = new Child();
$childList   = new CycleLink();
$child_1   = new Child(1);
$child_2   = new Child(2);
$child_3   = new Child(3);
$child_4   = new Child(4);
$childList->addNode($head,$child_1);
$childList->addNode($head,$child_2);
$childList->addNode($head,$child_3);
$childList->addNode($head,$child_4);
$childList->showNode($head);
echo "<pre>";
var_dump($head);
$findNode = $childList->findNode($head,3);
echo "<pre>";
var_dump($findNode);
$childList->delNode($head,2);
$childList->showNode($head);
echo $childList->getNodeNum();
exit();
*/
/**
 * 约瑟夫问题
 * 设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,
 * 它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
 * 并求出最后出列的人是哪个?
 */
class Josephu{
  private $head;
  private $childList;
  private $k;
  private $m;
  private $n;
  public function __construct($n,$k,$m){
    $this->k = $k;
    $this->m = $m;
    $this->n = $n;
    $this->createList($n);  // 创建小孩
    echo "<br/><br/>当前有 {$n} 个小孩,从第 {$k} 个小孩开始报数,数到 {$m} 退出<br/><br/>";
  }
  // 数数
  public function exec(){
    $currentNode = $this->childList->findNode($this->head,$this->k);  // 获取第一个开始报数的人
    $_num = 0;  // 当前数到的值
    $surplus_num = $this->n;
    // 开始报数
    while ($surplus_num>1) {  // 只要人数大于1,就继续报数
      // 当前报数值
      $_num++;
      $nextNode = $this->childList->getNextNode($this->head,$currentNode);
      // 数至第m个数,然后将其移除。报数恢复到0,重新循环。
      if( $_num==$this->m ){
        $_num = 0;
        $surplus_num--;
        // 当前小孩退出
        $this->childList->delNode($this->head,$currentNode->no);
        echo '<br/>退出小孩编号:' . $currentNode->no;
      }
      // 移动到下一个小孩
      $currentNode = $nextNode;
    }
    echo '<br/>最后一个小孩编号:' . $currentNode->no;
  }
  // 创建小孩
  private function createList($n){
    $this->childList = new CycleLink();
    $this->head = new Child();
    for ($i=1;$i<=$n;$i++){
      $node = new Child($i);
      $this->childList->addNode($this->head,$node);
    }
    $this->childList->showNode($this->head);
  }
}
$josephu = new Josephu(4, 1, 2);
$josephu->exec();

运行结果:

第 1 名小孩
第 2 名小孩
第 3 名小孩
第 4 名小孩

当前有 4 个小孩,从第 1 个小孩开始报数,数到 2 退出

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP内核探索:变量存储与类型使用说明
Jan 30 PHP
destoon数据库表说明汇总
Jul 15 PHP
php中print(),print_r(),echo()的区别详解
Dec 01 PHP
windows下配置php5.5开发环境及开发扩展
Dec 25 PHP
PHP的几个常用加密函数
Feb 03 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
golang 调用 php7详解及实例
Jan 04 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP的PDO错误与错误处理
Jan 27 PHP
php生成HTML文件的类方法
Oct 11 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 #PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 #PHP
PHP实现普通hash分布式算法简单示例
Aug 06 #PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 #PHP
PHP常用字符串函数小结(推荐)
Aug 05 #PHP
PHP使用标准库spl实现的观察者模式示例
Aug 04 #PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 #PHP
You might like
php简单提示框alert封装函数
2010/08/08 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
17个Python小技巧分享
2015/01/23 Python
Python中tell()方法的使用详解
2015/05/24 Python
python实现简单购物商城
2016/05/21 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
院领导写的就业推荐信
2014/03/09 职场文书
文体活动实施方案
2014/03/27 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
员工自我工作评价
2015/03/06 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python