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做的端口嗅探器--可以指定网站和端口
Oct 09 PHP
php Try Catch异常测试
Mar 01 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
第三章 php操作符与控制结构代码
Dec 30 PHP
php 搜索框提示(自动完成)实例代码
Feb 05 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
php在数组中查找指定值的方法
Mar 17 PHP
深入探究PHP的多进程编程方法
Aug 18 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
TP5框架页面跳转样式操作示例
Apr 05 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中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
JavaScript中的事件处理
2008/01/16 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
python实现中文转换url编码的方法
2016/06/14 Python
Python全局变量用法实例分析
2016/07/19 Python
python实现Decorator模式实例代码
2018/02/09 Python
python实现电脑自动关机
2018/06/20 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
高级文秘工作总结的自我评价
2013/09/28 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
网络编辑岗位职责
2014/03/18 职场文书
商业融资计划书
2014/04/29 职场文书
大学生心理活动总结
2014/07/04 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书