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采集相关教程之一 CURL函数库
Feb 15 PHP
php设计模式 State (状态模式)
Jun 26 PHP
分享PHP header函数使用教程
Sep 05 PHP
destoon二次开发入门示例
Jun 20 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
zend framework中使用memcache的方法
Mar 04 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
如何用Laravel包含你自己的帮助函数
May 27 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 GUID生成函数和类
2014/03/10 PHP
php+ajax实现文章自动保存的方法
2014/12/30 PHP
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
JS跨域代码片段
2012/08/30 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
nodejs基础应用
2017/02/03 NodeJs
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
Python找出微信上删除你好友的人脚本写法
2018/11/01 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
python3实现网页版raspberry pi(树莓派)小车控制
2020/02/12 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
销售2014年度工作总结
2014/12/08 职场文书
公司市场部岗位职责
2015/04/15 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
《火烧云》教学反思
2016/02/23 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技