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连接mysql数据库代码
Mar 10 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
Smarty的配置与高级缓存技术分享
Jun 05 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
php中的字符编码转换函数用法示例
Oct 20 PHP
PHP回溯法解决0-1背包问题实例分析
Mar 23 PHP
php限制文件下载速度的代码
Oct 20 PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 PHP
thinkphp命名空间用法实例详解
Dec 30 PHP
php 数据结构之链表队列
Oct 17 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 14 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
Vue计算属性的使用
2017/08/04 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
图文详解vue框架安装步骤
2019/02/12 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
微信分享invalid signature签名错误踩过的坑
2020/04/11 Javascript
python实现报表自动化详解
2017/11/16 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
Python GUI编程 文本弹窗的实例
2019/06/11 Python
Python3的socket使用方法详解
2020/02/18 Python
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
Reformation官网:美国女装品牌
2018/09/14 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
美容院考勤制度
2014/01/30 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
先进单位申报材料
2014/12/25 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
Oracle中update和select 关联操作
2022/01/18 Oracle