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面向对象编程快速入门
Dec 14 PHP
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
Mar 15 PHP
php 连接mysql连接被重置的解决方法
Feb 15 PHP
推荐25款php中非常有用的类库
Sep 29 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
php实现json编码的方法
Jul 30 PHP
Thinkphp无限级分类代码
Nov 11 PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
PDO::rollBack讲解
Jan 29 PHP
关于laravel模板中生成URL的几种模式总结
Oct 18 PHP
Laravel 错误提示本地化的实现
Oct 22 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中jpgraph类库的使用介绍
2013/08/08 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
js a标签点击事件
2017/03/30 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
详解Vite的新体验
2021/02/22 Javascript
Python获取网页上图片下载地址的方法
2015/03/11 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
python根据时间获取周数代码实例
2019/09/30 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
学生实习自我鉴定
2013/10/11 职场文书
咖啡店自主创业商业计划书
2014/01/22 职场文书
小组名称和口号
2014/06/09 职场文书
企业宣传标语
2014/06/09 职场文书
县委常委班子专题民主生活会查摆问题及整改措施
2014/09/27 职场文书
缅怀先烈主题班会
2015/08/14 职场文书