文章目录

  • 数据结构-PHP 并查集(Union Find)
    • 1.并查集示意图
    • 2.并查集合并
    • 3.并查集简单的代码示例
      • 3.1 PHP代码定义
    • 3.2 输出演示

数据结构-PHP 并查集(Union Find)

这篇文章主要介绍一下 并查集并查集 支持合并(Union)查询(Find)两种操作,其中 合并(Union) 表示把两个不相交的集合合并为一个集合,查询(Find) 表示查询两个元素是否在同一个集合中。

1.并查集示意图

并查集的特点是 儿子 节点指针指向父亲:

2.并查集合并

如下图所示,假设并查集中每个元素都不属于其他集合,下面给出初始指向示意图:

Tips:若要查找两个元素是否相连,可以找到两个元素分别对应的根节点元素值是否相等,若相等,则判断两个元素属于同一个集合。

3.并查集简单的代码示例

3.1 PHP代码定义

下面是一个 Union Find 类,__construct 构造函数初始化数据,如传入 size=20,那么 $parent 中会初始化 0~19 个指向自己的节点元素:

<?php
require 'UF.php';class UnionFind implements UF
{private $parent = [];private $size;private $sz = []; // sz[$i] 表示以 $i 为根的集合中的元素个数/*** 初始化并查集* UnionFind constructor.* @param int $size*/public function __construct(int $size){$this->size = $size;for ($i = 0; $i < $size; $i++) {$this->parent[$i] = $i;$this->sz[$i] = 1;}}/*** 返回并查集大小* @param int $p* @param int $q* @return int*/public function getSize(int $p, int $q): int{return $this->size;}/*** 查找p对应的集合编号* @param int $p*/public function findRoot(int $p){if ($p < 0 || $p >= $this->size) {echo "404";exit;}while ($p != $this->parent[$p]) {$p = $this->parent[$p];}return $p;}/*** 判断两个元素是否属于同一个集合* @param int $p* @param int $q* @return bool*/public function isConnected(int $p, int $q): bool{return $this->findRoot($p) == $this->findRoot($q);}/*** 合并两个元素* @param int $p* @param int $q*/public function unionElements(int $p, int $q): void{$pRoot = $this->findRoot($p);$qRoot = $this->findRoot($q);if ($pRoot != $qRoot) {if ($this->sz[$pRoot] < $this->sz[$qRoot]) { //比较两个合并元素根节点的元素个数$this->parent[$pRoot] = $qRoot;$this->sz[$qRoot] += $this->sz[$pRoot];} else {$this->parent[$qRoot] = $pRoot;$this->sz[$pRoot] += $this->sz[$qRoot];}}}
}

Tips:代码中的合并默认是 $pRoot 指向 $qRoot ,可以优化成基于 根节点元素所包含元素总数 来决定合并方式的,元素少根节点会被合并到 元素多 的节点上,还可以根据 并查集的深度 来决定谁被合并。

3.2 输出演示

<?php
require 'UnionFind.php';
$size = 10000;
$uf = new UnionFind($size);
$m = 500;
for ($i = 0; $i < $m; $i++) {$a = mt_rand(0, $size - 1);$b = mt_rand(0, $size - 1);$uf->unionElements($a, $b);
}
var_dump($uf->isConnected(50,100)); //判断 50 和 100是否相连$size = 10000;
$uf = new UnionFind($size);
$m = 11000;
for ($i = 0; $i < $m; $i++) {$a = mt_rand(0, $size - 1);$b = mt_rand(0, $size - 1);$uf->unionElements($a, $b);
}
var_dump($uf->isConnected(50,100)); //判断 50 和 100是否相连

输出如下图:

代码仓库 :https://gitee.com/love-for-poetry/data-structure

扫码关注爱因诗贤

数据结构-PHP 并查集(Union Find)相关推荐

  1. 数据结构与算法(十二)并查集(Union Find)及时间复杂度分析

    本文主要包括以下内容: 并查集的概念 并查集的操作 并查集的实现和优化 Quick Find Quick Union 基于size的优化 基于rank的优化 路径压缩优化 并查集的时间复杂度 并查集的 ...

  2. 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用

    二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...

  3. 数据结构 之 并查集

    并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构 ...

  4. 数据结构之并查集Union-Find Sets

    1.  概述 并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 2.  基本操作 并查集 ...

  5. 数据结构 之 并查集(Disjoint Set)

    一.并查集的概念:     首先,为了引出并查集,先介绍几个概念:     1.等价关系(Equivalent Relation)     自反性.对称性.传递性.     假设a和b存在等价关系.记 ...

  6. 数据结构 7并查集(DISJOINT SET)

    并查集(The disjoint set ADT) 等价关系 Relation R:若对于每一对元素(a,b),a,b∈S,aRb或者为true或者为false,则称集合S上定义关系R.如果aRb为t ...

  7. [重修数据结构0x03]并查集、堆、优先队列(2021.8.11)

    前言 在做遍历的题目的时候,发现掌握一些特殊的数据结构和技巧有时对解决题目有着决定性的作用,不可不学.因此特地拿出来两天学习一下并查集.堆.优先队列.以后有更多思考和感悟再加补充吧.内容来自算法笔记, ...

  8. 高阶数据结构(1):并查集 与 图

    "Head in the clouds" 一.并查集 (1)认识并查集? 在一些问题中需要将n个不同的元素划分成 一些不想交的集合. 开始时,每个元素自成一个单元素集合,然后按一定 ...

  9. 0x41.数据结构进阶 - 并查集

    目录 一.路径压缩与按秩合并 1.AcWing 237. 程序自动分析(NOIP2015) 二.边带权并查集 1.AcWing 238. 银河英雄传说(边带权并查集模板) 2.AcWing 239. ...

最新文章

  1. Oracle VM VirtualBox 虚拟机中ubuntu里,鼠标滚轮不能使用
  2. 【javascript基础】由demo来进阶学习闭包等概念
  3. c++ -O1,-O2,-O3资料整理
  4. 一篇很全面的freemarker教程
  5. 四核处理器_(技术文档)你知道AMD Ryzen处理器中的CCX与CCD是什么吗?
  6. python三大特征六大原则_面向对象程序设计(Object Oriented Programming)的三大特性,六大原则...
  7. 如何利用开源项目,帮助企业免费搭建小程序官网
  8. ofstream 的中文目录问题
  9. 上传图片方法大全 [网摘]
  10. python语言是二进制语言吗_在大型项目上,Python 是个烂语言吗?
  11. [!] Unable to satisfy the following requirements:
  12. C语言小项目——电子秒表(毫秒级)
  13. 用opencv压缩图片
  14. 【群晖Nas开启WebDAV服务,路由器映射端口,实现Win10远程映射网路驱动器】
  15. Pathon基础篇数据类型之——数值、字符串与列表内容
  16. iOS 直播间礼物动画队列
  17. 视频知识点(14)- 来,咱们聊一聊 I 帧和 IDR 帧的区别
  18. MATLAB 2020a的参考安装教程
  19. Matlab使用文件框选择文件
  20. LeetCode题解汇总

热门文章

  1. 那些成功学和鸡汤文没有告诉你的
  2. 5_区块结构和交易结构分析
  3. 华清远见-重庆中心-前端阶段个人总结
  4. 嵌入式单片机基础篇(八)之两只看门狗
  5. 《数据库原理》知识点整理+习题
  6. java 千分之一的概率_概率是多少?打造师经验总结,大概千分之一
  7. 124-Python_百钱买百鸡:一只公鸡5 元钱,一只母鸡 3 元钱三只小鸡1元钱现在要用 100 元钱买 100 只鸡,问公鸡、母鸡、小鸡各多少只?请利用列表推导式解决该问题。
  8. Davinci使用说明
  9. android scrollview 动画滚动,Android使用ScrollView实现滚动效果
  10. 关于打开虚拟机vmware镜像就蓝屏(注:主要针对轻薄本本以及高性能游戏本)