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部分常见问题总结
Mar 27 PHP
php求正负数数组中连续元素最大值示例
Apr 11 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
学习php中的正则表达式
Aug 17 PHP
Chrome Web App开发小结
Sep 04 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
简单了解WordPress开发中update_option()函数的用法
Jan 11 PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 PHP
php生成与读取excel文件
Oct 14 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
PHP单例模式详解及实例代码
Dec 21 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去除HTML标签实例
2013/11/06 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
JS hashMap实例详解
2016/05/26 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
自制简易打赏功能的实例
2017/09/02 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
python flask安装和命令详解
2019/04/02 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
python实现广度优先搜索过程解析
2019/10/19 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
Python如何定义有默认参数的函数
2020/08/10 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
《颐和园》教学反思
2014/02/26 职场文书
大学生村官考核材料
2014/05/23 职场文书
学生安全责任书模板
2014/07/25 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
2015年世界水日活动总结
2015/02/09 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
党支部对转正的意见
2015/06/02 职场文书
部门主管竞聘书
2015/09/15 职场文书
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android