PHP实现克鲁斯卡尔算法实例解析

 更新时间:2014年08月22日 11:49:00   投稿:shichen2014  
这篇文章主要介绍了PHP实现克鲁斯卡尔算法实例解析,是PHP程序设计中一个比较经典的应用,需要的朋友可以参考下

本文实例展示了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 图像处理类1

    两个强悍的php 图像处理类1

    基本图片处理,用于完成图片缩入,水印添加,当水印图超过目标图片尺寸时,水印图能自动适应目标图片而缩小,水印图可以设置跟背景的合并度
    2009-06-06
  • PHP封装cURL工具类与应用示例

    PHP封装cURL工具类与应用示例

    这篇文章主要介绍了PHP封装cURL工具类与应用,结合实例形式分析了php基于面向对象封装的curl请求、响应、参数设置等相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • thinkphp jquery实现图片上传和预览效果

    thinkphp jquery实现图片上传和预览效果

    这篇文章主要为大家详细介绍了thinkphp上传图片功能,和jquery预览图片效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • php简单浏览目录内容的实现代码

    php简单浏览目录内容的实现代码

    本篇文章是对php简单浏览目录内容的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php用户注册时常用的检验函数实例总结

    php用户注册时常用的检验函数实例总结

    这篇文章主要介绍了php用户注册时常用的检验函数,以类的形式实例总结了用户名验证、邮箱验证、QQ验证等常用的验证技巧,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • php 禁止页面缓存输出

    php 禁止页面缓存输出

    主要设计思想就是让它在过去就“失效",防止重复提交等返回操作。
    2009-01-01
  • PHP中文字符串截断无乱码解决方法

    PHP中文字符串截断无乱码解决方法

    这篇文章主要为大家详细介绍了PHP获取用户客户端真实IP的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 搭建自己的PHP MVC框架详解

    搭建自己的PHP MVC框架详解

    这篇文章主要介绍了搭建自己的PHP MVC框架的方法,详细分析了php构建MVC框架的具体步骤、相关操作技巧与注意事项,需要的朋友可以参考下
    2017-08-08
  • PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例

    PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例

    这篇文章主要介绍了PHP操作redis实现的分页列表,新增,删除功能封装类与用法,结合实例形式分析了php针对redis数据库基本的连接、查询、添加、分页等操作封装与使用技巧,需要的朋友可以参考下
    2018-08-08
  • php使用curl实现ftp文件下载功能

    php使用curl实现ftp文件下载功能

    这篇文章主要为大家详细介绍了php使用curl实现ftp文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论