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 has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
php 空格,换行,跳格使用说明
Dec 18 PHP
PHP Zip压缩 在线对文件进行压缩的函数
May 26 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
PHP执行批量mysql语句的解决方法
May 02 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
Yii中创建自己的Widget实例
Jan 05 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
Oct 18 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
Nov 18 PHP
PHP实现的观察者模式实例
Jun 21 PHP
PHP实现重载的常用方法实例详解
Oct 18 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导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
greybox——不开新窗口看新的网页
2007/02/20 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
介绍Python中的fabs()方法的使用
2015/05/14 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
Python之re操作方法(详解)
2017/06/14 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
python_mask_array的用法
2020/02/18 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
说出一些常用的类,包,接口
2014/09/22 面试题
幼儿教师思想汇报
2014/01/10 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
诉讼授权委托书
2014/10/15 职场文书
检讨书格式
2015/05/07 职场文书
2016年校长新年寄语
2015/08/17 职场文书
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL