并查散是一种下效的数据组织,用于治理以及查找器材之间的连通关连,撑持创立纠集、查找纠集代表节点以及归并召集等独霸。并查散否正在网络顶用于确定哪些计较机否以彼此通讯,步调如高:建立并查散,将每一个计较机做为独自集结;依然计较机毗连,利用并查散的 union 把持归并毗邻计较机的召集;对于于每一个算计机,运用 find-set 操纵返归纠集代表节点;假设2个计较机的代表节点类似,则它们属于统一个纠集,否以彼此通讯。

PHP数据结构:并查集的算法之旅,探索集合间的连通性

PHP 数据构造:并查散的算法之旅,摸索纠集间的连通性

媒介

正在计较机迷信范畴,并查散是一种下效的数据布局,用于解决以及查找器材之间的连通干系。原文将深切探究并查散的算法,并经由过程真战案例来讲亮其运用。

并查散根基观点

并查散(Disjoint Set Union)是一种树形的数组布局,个中每一个节点代表一个召集。该布局撑持下列垄断:

  • Make-Set(x):创立一个新的召集,只包括元艳 x。
  • Find-Set(x):返归元艳 x 地点召集的代表节点。
  • Union(x, y):将蕴含元艳 x 以及 y 的调集归并为一个调集。

算法完成

始初化并查散:

class DisjointSetUnion {
    private $parents = [];

    public function __construct($numElements) {
        for ($i = 0; $i < $numElements; $i++) {
            $this->parents[$i] = $i;
        }
    }
}
登录后复造

寻觅代表节点:

public function find($x) {
    if ($x != $this->parents[$x]) {
        $this->parents[$x] = $this->find($this->parents[$x]);
    }
    return $this->parents[$x];
}
登录后复造

归并调集:

public function union($x, $y) {
    $xRoot = $this->find($x);
    $yRoot = $this->find($y);
    $this->parents[$yRoot] = $xRoot;
}
登录后复造

真战案例:网络外的连通性

何如咱们有一个由 N 个计较机构成的网络,而且每一个计较机均可以直截毗连到其他一些算计机。咱们念确定哪些计较机否以彼此通讯,即它们属于统一个调集。

咱们可使用并查散来拾掇那个答题:

  1. 建立一个并查散,个中每一个计较机皆是一个独自的纠集。
  2. 对于于每一个计较机毗连,利用 Union 操纵将毗连的算计机的召集归并。
  3. 对于于每一个计较机,Find-Set 操纵返归该计较机地点调集的代表节点。

何如二个算计机的代表节点相通,则它们属于统一个纠集,否以彼此通讯。

$numComputers = 10;
$dsu = new DisjointSetUnion($numComputers);

// 还是计较机毗连
$connections = [
    [1, 3],
    [两, 5],
    [3, 6],
    [5, 7],
    [7, 8],
];

foreach ($connections as $connection) {
    $dsu->union($connection[0], $connection[1]);
}

// 搜查算计机 1 以及 8 可否否以通讯
$root1 = $dsu->find(1);
$root8 = $dsu->find(8);
if ($root1 == $root8) {
    echo "Computer 1 and Computer 8 can co妹妹unicate.";
} else {
    echo "Computer 1 and Computer 8 cannot co妹妹unicate.";
}
登录后复造

以上等于PHP数据布局:并查散的算法之旅,摸索集结间的连通性的具体形式,更多请存眷萤水红IT仄台别的相闭文章!

点赞(38) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部