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后台程序与Javascript的两种交互方式
Oct 25 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
PHP 解决session死锁的方法
Jun 20 PHP
php生成xml时添加CDATA标签的方法
Oct 17 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
jquery获取多个checkbox的值异步提交给php的方法
Jun 24 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
浅谈php和js中json的编码和解码
Oct 24 PHP
PHP符合PSR编程规范的实例分享
Dec 21 PHP
PHP实现二维数组根据key进行排序的方法
Dec 30 PHP
使用WAMP搭建PHP本地开发环境
May 10 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
Zend引擎的发展 [15]
2006/10/09 PHP
做个自己站内搜索引擎
2006/10/09 PHP
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
jquery replace方法去空格
2017/05/08 jQuery
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
js实现聊天对话框
2020/02/08 Javascript
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
利用python程序帮大家清理windows垃圾
2017/01/15 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
人事行政主管岗位职责
2013/12/22 职场文书
项目合作协议书
2014/04/16 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
小学捐书活动总结
2014/07/05 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏
Python如何用re模块实现简易tokenizer
2022/05/02 Python
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers