PHP实现克鲁斯卡尔算法实例解析


Posted in PHP onAugust 22, 2014

本文实例展示了PHP实现的格鲁斯卡尔算法(kruscal)的实现方法,分享给大家供大家参考。相信对于大家的PHP程序设计有一定的借鉴价值。

具体代码如下:

<?php
require 'edge.php';
$a = array(
  'a',
  'b',
  'c',
  'd',
  'e',
  'f',
  'g',
  'h',
  'i'
);
$b = array(
  'ab' => '10',
  'af' => '11',
  'gb' => '16',
  'fg' => '17',
  'bc' => '18',
  'bi' => '12',
  'ci' => '8',
  'cd' => '22',
  'di' => '21',
  'dg' => '24',
  'gh' => '19',
  'dh' => '16',
  'de' => '20',
  'eh' => '7',
  'fe' => '26'
);
$test = new Edge($a, $b);
print_r($test->kruscal());
?>

edge.php文件代码如下:

<?php
//边集数组的边类
class EdgeArc {
  private $begin; //起始点
  private $end; //结束点
  private $weight; //权值
  public function EdgeArc($begin, $end, $weight) {
    $this->begin = $begin;
    $this->end = $end;
    $this->weight = $weight;
  }
  public function getBegin() {
    return $this->begin;
  }
  public function getEnd() {
    return $this->end;
  }
  public function getWeight() {
    return $this->weight;
  }
}
class Edge {
  //边集数组实现图
  private $vexs; //顶点集合
  private $arc; //边集合
  private $arcData; //要构建图的边信息
  private $krus; //kruscal算法时存放森林信息
  public function Edge($vexsData, $arcData) {
    $this->vexs = $vexsData;
    $this->arcData = $arcData;
    $this->createArc();
  }
  //创建边
  private function createArc() {
    foreach ($this->arcData as $key => $value) {
      $key = str_split($key);
      $this->arc[] = new EdgeArc($key[0], $key[1], $value);
    }
  }
  //对边数组按权值排序
  public function sortArc() {
    $this->quicklySort(0, count($this->arc) - 1, $this->arc);
    return $this->arc;
  }
  //采用快排
  private function quicklySort($begin, $end, &$item) {
    if ($begin < 0($begin >= $end)) return;
    $key = $this->excuteSort($begin, $end, $item);
    $this->quicklySort(0, $key - 1, $item);
    $this->quicklySort($key + 1, $end, $item);
  }
  private function excuteSort($begin, $end, &$item) {
    $key = $item[$begin];
    $left = array();
    $right = array();
    for ($i = ($begin + 1); $i <= $end; $i++) {
      if ($item[$i]->getWeight() <= $key->getWeight()) {
        $left[] = $item[$i];
      } else {
        $right[] = $item[$i];
      }
    }
    $return = $this->unio($left, $right, $key);
    $k = 0;
    for ($i = $begin; $i <= $end; $i++) {
      $item[$i] = $return[$k];
      $k++;
    }
    return $begin + count($left);
  }
  private function unio($left, $right, $key) {
    return array_merge($left, array(
      $key
    ) , $right);
  }
  //kruscal算法
  public function kruscal() {
    $this->krus = array();
    $this->sortArc();
    foreach ($this->vexs as $value) {
      $this->krus[$value] = "0";
    }
    foreach ($this->arc as $key => $value) {
      $begin = $this->findRoot($value->getBegin());
      $end = $this->findRoot($value->getEnd());
      if ($begin != $end) {
        $this->krus[$begin] = $end;
        echo $value->getBegin() . "-" . $value->getEnd() . ":" . $value->getWeight() . "\n";
      }
    }
  }
  //查找子树的尾结点
  private function findRoot($node) {
    while ($this->krus[$node] != "0") {
      $node = $this->krus[$node];
    }
    return $node;
  }
}
?>

感兴趣的读者可以调试运行一下本文克鲁斯卡尔算法实例,相信会有新的收获。

PHP 相关文章推荐
php 无极分类(递归)实现代码
Jan 05 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
PHP中的魔术方法总结和使用实例
May 11 PHP
yii数据库的查询方法
Dec 28 PHP
非常重要的php正则表达式详解
Jan 04 PHP
PHP微信分享开发详解
Jan 14 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
Feb 18 PHP
highchart数据源纵轴json内的值必须是int(详解)
Feb 20 PHP
php登录超时检测功能实例详解
Mar 21 PHP
PHP时间函数使用详解
Mar 21 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
Aug 22 #PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 #PHP
PHP中new static()与new self()的区别异同分析
Aug 22 #PHP
PHP中的替代语法简介
Aug 22 #PHP
destoon供应信息title调用出公司名称的方法
Aug 22 #PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 #PHP
destoon文章模块调用企业会员资料的方法
Aug 22 #PHP
You might like
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
php文件上传的例子及参数详解
2013/12/12 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
PDO::inTransaction讲解
2019/01/28 PHP
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
javascript冒泡排序小结
2016/04/10 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
Node.js + express基本用法教程
2019/03/14 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
python利用装饰器进行运算的实例分析
2015/08/04 Python
简单解决Python文件中文编码问题
2015/11/22 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
python监控文件并且发送告警邮件
2018/06/21 Python
深入学习python多线程与GIL
2019/08/26 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
应届毕业生个人自我评价
2013/09/20 职场文书
实习教师个人的自我评价
2013/11/08 职场文书
生态养殖创业计划书
2014/05/06 职场文书
电工技术比武方案
2014/05/11 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书