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 相关文章推荐
使用数据库保存session的方法
Oct 09 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
ajax 的post方法实例(带循环)
Jul 04 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
Mar 14 PHP
Zend Framework教程之Zend_Registry对象用法分析
Mar 22 PHP
ThinkPHP使用Ueditor的方法详解
May 20 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
Jul 28 PHP
php代码检查代理ip的有效性
Aug 19 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
Dec 15 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 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 fsockopen函数被禁用的解决办法
2013/08/07 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
javascript 框架小结 个人工作经验
2009/06/13 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
Javascript window对象详解
2014/11/12 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
Numpy之random函数使用学习
2019/01/29 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
详解Python 切片语法
2019/06/10 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
HTML5如何实现元素拖拽
2016/03/11 HTML / CSS
医学院学生的自我评价分享
2013/11/19 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
超市中秋节活动方案
2014/02/12 职场文书
优秀护士先进事迹
2014/05/08 职场文书
温馨提示标语
2014/06/26 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
python turtle绘图命令及案例
2021/11/23 Python