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+java实现自动新闻滚动窗口
Oct 09 PHP
PHP 程序员的调试技术小结
Nov 15 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 PHP
php ci框架中加载css和js文件失败的原因及解决方法
Jul 29 PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
thinkPHP5.0框架开发规范简介
Mar 25 PHP
PHP实现json_decode不转义中文的方法
May 20 PHP
PHP使用PDO操作sqlite数据库应用案例
Mar 07 PHP
php的优点总结 php有哪些优点
Jul 19 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 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将数据库导出成excel的方法
2010/05/07 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
2017/03/09 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
js中数组对象去重的两种方法
2019/01/18 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
ipad上运行python的方法步骤
2019/10/12 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
python时间日期操作方法实例小结
2020/02/06 Python
windows下python安装pip方法详解
2020/02/10 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
python中os.remove()用法及注意事项
2021/01/31 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
活动总结书
2014/05/08 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
作风转变年心得体会
2014/10/22 职场文书
2015年工程部工作总结
2015/04/30 职场文书
家庭贫困证明
2015/06/16 职场文书
就业证明函
2015/06/17 职场文书
初三数学教学反思
2016/02/17 职场文书