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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
PHP MemCached 高级缓存应用代码
Aug 05 PHP
php调用shell的方法
Nov 05 PHP
php连接与操作PostgreSQL数据库的方法
Dec 25 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
php获取错误信息的方法
Jul 17 PHP
PHP编写RESTful接口
Feb 23 PHP
PHP实现原生态图片上传封装类方法
Nov 08 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
详解如何在云服务器上部署Laravel
Jun 30 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
thinkphp5+layui实现的分页样式示例
Oct 08 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
web方式ftp
2006/10/09 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
js函数排序的实例代码
2013/07/01 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
python Pillow图像处理方法汇总
2019/10/16 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
2020/05/25 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
如何利用Python 进行边缘检测
2020/10/14 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
python 实现有道翻译功能
2021/02/26 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
自动一体化专业求职信
2014/03/15 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
高校自主招生自荐信2015
2015/03/04 职场文书
结婚典礼致辞
2015/07/28 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
Redis分布式锁Redlock的实现
2021/08/07 Redis
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python