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 解决旧系统 查出所有数据分页的类
Aug 27 PHP
整理的一些实用WordPress后台MySQL操作命令
Jan 07 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
php实现汉字验证码和算式验证码的方法
Mar 07 PHP
10条php编程小技巧
Jul 07 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
Jun 25 PHP
PHP常用函数之根据生日计算年龄功能示例
Oct 21 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 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速成大法
2015/01/30 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
js replace正则表达式应用案例讲解
2013/01/17 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
Python实现最常见加密方式详解
2019/07/13 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
Python 如何展开嵌套的序列
2020/08/01 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
公司企业表扬信
2014/01/11 职场文书
安卓程序员求职信
2014/02/28 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
退货证明模板
2015/06/23 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript