并查集 Union-Find

并查集(Union-Find)算法详解 并查集(Union-Find)是解决动态连通性问题的一类非常高效的数据结构。本文中,我将尽我所能用最简单,最清晰的逻辑展示出并查集的构造过程,同时还将对其中的关键步骤给出相应的Python代码。动态连通性可以想象一张地图上有很多点,有些点之间是有道路相互联通的,而有些点则没有。如果我们现在要从点A走向点B,那么一个关键的问题就是判断我们能否从A走到B呢?换句话说,A和B是否是连通的。这是动态连通性最 阅读详情

并查集 Union-Find

基本结构

public class UF {
    private int count;
    private int[] id;

    public UF(int n) {
        count = n;
        id = new int[n];
        for (int i = 0; i < n; i++) {
            id[i] = i;
        }
    }

    public int count() {
        return count;
    }

    public boolean connected(int p, int q) {
        return find(p) == find(q);
    }
    
    public int find(int p);
    public void union(int p, int q);
}

M - 边数 N - 节点数

Quick-Find ~ O(MN)O(MN)O(MN)

暴力法,将前一元素所在的连通分量中所有元素的标识全部重置为后一元素所在的连通分量

public int find(int p) {
    return id[p];
}

// 将所有id[p]全部重赋值为id[q]
public void union(int p, int q) {
    int pID = find(p);
    int qID = find(q);
    if (pID==qID) {
        return;
    }
    for (int i = 0; i < id.length; i++) {
        if (id[i] == pID) {
            id[i] = qID;
        }
    }
    // 每一次合并都会使连通分量总数减1
    count--;
}

Quick-Union ~ O(M)−O(MN)O(M)-O(MN)O(M)−O(MN)

将连通分量当作树处理,以根节点作为各个分量的标识符,每次union只将两颗树的根节点合并。

public int find(int p) {
    // 向上追溯寻找根节点
	while (p != id[p]) {
        p = id[p];
    }
    return p;
}

public void union(int p, int q) {
	int pRoot = find(p);
	int qRoot = find(q);
	if (pRoot == qRoot) {
		return;
	}
    // 将一个分量的根节点连接到另一个分量的根节点
	id[pRoot] = qRoot;
    // 每一次合并都会使连通分量总数减1
	count--;
}

Weighted Quick-Union ~ O(MlogN)O(MlogN)O(MlogN)

public class UF {
    private int count;
    private int[] id;
    private int[] height;	// 记录树高

    public UF(int n) {
        count = n;
        id = new int[n];
        height = new int[n];
        for (int i = 0; i < n; i++) {
            id[i] = i;
            height[i] = 0;
        }
    }

    public int count() {
        return count;
    }

    public boolean connected(int p, int q) {
        return find(p) == find(q);
    }

    public int find(int p) {
        while (p != id[p]) {
            p = id[p];
        }
        return p;
    }

    public void union(int p, int q) {
        int pRoot = find(p);
        int qRoot = find(q);
        
        if (pRoot == qRoot) {
            return;
        }
        
        // 将矮树并入高树
        if (height[pRoot] < height[qRoot]) {
            id[pRoot] = qRoot;
        } else {
            id[qRoot] = pRoot;
            // 当且仅当两树高相同时才会使合并后的树高加1
            if (height[pRoot] == height[qRoot]) {
                height[pRoot]++;
            }
        }
        count--;
    }
}

Path Compression - 非递归

// Two-pass
public int find(int p) {
    int root = p;
    while (root != id[root]) {
        root = id[root];
    }
    
    while (p != root) {
    	int temp = id[p];
        id[p] = root;
        p = temp;
    }
    
    return p;
}

// One-pass
public int find(int p) {
    while (p != id[p]) {
        // 相当于减半搜索路径
        id[p] = id[id[p]];
        p = id[p];
    }
    return p;
}

Path Compression - 递归

public int find(int p) {
    if (id[p] == p) {
        return p;
    }
    
    int root = find(id[p]);
    id[p] = root;
    return root;
}
并查集(Union-Find)算法全面详解 一、前言 在看一个算法题时,其中一种解法用到了并查集,并查集在《算法第四版——1.5案例研究: union-find 算法》中有讲解,这里按照自己的理解记录一下并查集。 二、用途 并查集用于判断连个点所在的集合是否属于同一个集合,若属于同一个集合但还未合并则将两个集合进行合并。同一个集合的意思是这两个点是连通的,直接相连或者通过其它点连通。 三、什么是并查集 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在.. 阅读详情

相关推荐

并查集(Union-Find) 应用举例 --- 基础篇

本文是作为上一篇文章 《并查集算法原理和改进》 的后续,焦点主要集中在一些并查集的应用上。材料主要是取自POJ,HDOJ上的一些算法练习题。 首先还是回顾和总结一下关于并查集的几个关键点: 以树作为节点的组织结构,结构的形态很是否采取优化策略有很大关系,未进行优化的树结构可能会是“畸形”树(严重不平衡,头重脚轻,退化成链表等),按尺寸(正规说法叫做秩,后文全部用秩来表示)进行平

不忘初心,好好沉淀 3万+

并查集(Union-Find)

并查集是一种巧妙的算法思想,主要解决连通性问题的场景,比如:一组对象被划分成了若干个区域,求解被划分区域的数量,或者求解如何将这几个区域连接起来。 文章目录1. 并查集(Union-Find)算法介绍1.1 动态连通性1.2 union-find算法API2 union-find的实现2.1 quick-find算法2.2 quick-union算法2.3 加权quick-union算法2.4 使用路径压缩的加权quick-union算法2.5 算法比较 1. 并查集(Union-Find)算法介绍 1.1

小朱小朱绝不认输的博客 1806

Union and Find(并查集)

Union-and-Find 数据结构的简单介绍、伪代码与C++实现

ZJ_11701的博客 415

【算法·命运-18】并查集

并查集(Union-Find,也叫,简称 DSU)是一种用于处理集合合并与查询的问题的数据结构,特别适用于解决连通性问题,如判断两个元素是否在同一集合、合并两个集合等。它通常用于动态连通性的问题,广泛应用于图的处理、网络连接、社交网络等领域。

m0_69378371的博客 1050

k-shape时间序列聚类实战:从理论到tslearn实现

本文深入探讨了k-shape时间序列聚类算法,从核心原理到tslearn库的实战应用。k-shape通过标准化互相关系数衡量序列形状相似性,专注于识别波动模式而非绝对数值。文章详细介绍了算法流程、Python环境搭建、数据预处理、最佳K值确定方法,并通过完整代码示例展示了模型训练与结果可视化,帮助读者掌握这一强大的“形状捕手”工具。

weixin_29061465的博客 171

Jenkins测试详细使用教程(二):jenkins两种主要构建方法

Jenkins有两种定义构建作业的主要方法:(自由风格项目)和Pipeline(流水线项目)。

m0_62825058的博客 2434

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

并查集是管理集合合并与查询的高效数据结构,通过路径压缩和按秩合并优化,实现接近常数时间的合并与查询操作,广泛用于连通性问题。

zhangmohan123321的博客 842

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。涵盖环境配置、本体结构设计、实例填充到可视化展示的全流程,特别适合初学者快速掌握知识建模技术。通过实战案例演示,帮助读者理解如何定义类、属性及建立实例关系,是学习知识图谱构建的实用教程。

weixin_42548816的博客 553

并查集(Union-Find) (图文详解)

并查集 数据结构 算法 Leetcode

qq_57469718的博客 1万+

TwinCAT3 主站动态配置 PDO 的实战技巧与性能优化

本文深入探讨了TwinCAT3主站动态配置PDO的实战技巧与性能优化策略。通过对比静态PDO的局限,阐述了动态配置在提升系统灵活性、降低网络负载和保障实时性方面的核心优势。文章提供了从环境准备、代码实现到错误排查的完整流程,并重点解析了PDO映射、SDO通道区别以及分布式时钟同步等关键概念,帮助工程师掌握EtherCAT网络性能调优的核心方法。

weixin_29213525的博客 346

《无人驾驶车辆模型预测控制》(第二版)第四章详细学习——算法部分

根据代码进行的“MPC跟踪直线和圆算法”的详细推导学习记录。

Fengdf666的博客 5015

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

并查集(Union-Find) 是一种用于管理 不相交集合(Disjoint Sets) 的数据结构,主要支持以下两种操作:Find(u):查找元素 u 所属的集合(通常返回其根节点);Union(u, v):合并两个元素 u 和 v 所在的集合。并查集广泛应用于:图的连通性问题(如Kruskal算法求最小生成树);动态连通性问题(如社交网络中的好友关系);游戏开发(如像素连通性检测)。

大葱的田地🌱 1651

北斗导航 | 基于matlab的卫星导航单点定位算法

单点定位(Single Point Positioning, SPP)通过接收机观测至少4颗卫星的伪距(含误差的距离测量值),解算接收机位置(经度、纬度、高度)及钟差。HDOP < 2 为高精度定位条件。

尘世冰封的专栏 969

并查集(Union-Find)算法介绍

本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find。 更多的信息可以参考Algorithms 一书的Section 1.5,实际上本文也就是基于它的一篇读后感吧。 原文中更多的是给出一些结论,我尝试给出一些思路上的过程,即为什么要使用这个方法,而不是别的什么方法。我觉得这个可能更加有意义一些,相比于记下一些结论。

不忘初心,好好沉淀 24万+

基于STM32L4XX、HAL库的ICP-10111压力传感器驱动程序设计

define ICP10111_CMD_MEAS_ULN 0x7866 // 超低噪声模式。#define ICP10111_CMD_MEAS_LP 0x609C // 低功耗模式。#define ICP10111_CMD_MEAS_LN 0x70DF // 低噪声模式。#define ICP10111_CMD_MEAS_N 0x6825 // 正常模式。ICP10111_MODE_LN, // 低噪声。// 等待测量完成(根据模式不同等待时间不同)

zhusl6688的博客 416

2、MOSFET基本物理效应及其BSIM4模型解析

本文深入探讨了MOSFET的基本物理效应及其在BSIM4模型中的数学表述,涵盖门和沟道的几何结构、温度依赖性、材料模型选项、阈值电压计算、以及其他关键物理效应如LDD电阻、有限电荷厚度、有效迁移率等。同时解析了机械应力、邻近效应及布局依赖效应对MOSFET性能的影响,并通过参数表和建模流程提供了精确建模的指导,旨在帮助读者优化MOSFET器件性能与可靠性。

purple的博客 564

并查集 Union Find

并查集 Union Find

底层码农 6611

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java 并查集Union Find

并查集:由孩子指向父亲的一种数据结构。 该数据结构可以很高效的解决:连接问题(Connectivity Problem) 例如:给出两个点,判断两个点是否可以通过路径连接起来。再如左上角的点与右下角的点是否是相连的? 判断网络中节点间的连接状态。 连接问题和路径问题: 连接问题比路径问题要回答的问题少,因为连接问题只需要回答是否连接,而路径问题需要回答是否连接,路径是什么。 这就表...

抛弃幻想,准备斗争 876

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

并查集和Union-Find算法及其改进

并查集 定义        并查集(Union-Find Sets)也叫不相交集合(Disjoint Sets),是一种用于维护若干个不相交元素所构成的集合的一种树型数据结构。并查集常用来处理一些不相交元素的合并与查询问题,在使用中常常用森林来表示。   主要操作         一个并查集数据结构维护了一个不相交动态集的集合。我们用一个代表(根节点)来标识每个集合,它是这个集合的某个成...

程序人生 1155

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

并查集- Union-Find

并查集(Union-Find)主要是用于解决连通问题。给定一些数据对,判断这些集合中连通量有 多少,或者判断给定两个点是否是连通。本篇博客主要是简要介绍并查集的结构,以及并查的优化

任杰的博客 998

并查集的qiuck find 和qiuck union

并查集总共就两个大的作用:并(union)和查(find)。union就是让两个不属于同一个集合的节点,放在一个集合上find就是查看两个节点是否是在同一个集合上其中用代码表示就是两种方法:quick find 和quick union。

whitefish_cat的博客 609

union-find(并查集)算法

背景: union-find算法是用来解决动态连通性问题的。 动态连通性问题的数学表达: 问题的输入是一列整数对。一个整数对可以被理解成这个整数对的两个整数相连。 eg:我们输入整数对 p,q,那么"p和q是相连的"。 相连:我们假设相连是一种对等的关系,就意味着它有 自反性:p和p是相连的 对称性:如果p和q相连,那么q和p也是相连的 传递性:如果p和q是相连的,q和r是相连的,那么p和r而是相连的 问题:我们已知一些整数对(即所有点的相连关系),那么如何得知某两个点是否相连? 现实中的例子: 大型网

trina121的博客 2989

并查集(Union-Find Algorithm),看这一篇就够了

动态连接(Dynamic connectivity)的问题 所谓的动态连接问题是指在一组可能相互连接也可能相互没有连接的对象中,判断给定的两个对象是否联通的一类问题。这类问题可以有如下抽象: 有一组构成不相交集合的对象 union: 联通两个对象 find: 返回两个对象之间是否存在一条联通的通路 ˇ 在使用union-find处理动态连接的问题时,我们一般将这一组对象抽象...

正西风落叶下长安 3万+

LeetCode Union-Find(并查集) 专题(一)

LeetCode Union-Find(并查集) 专题(一)前言: 写这个专题本意还是和之前一样 ,一篇一篇写博客写的腻了。来个专题换换感觉。(手动滑稽好吧其实是觉得并查集是一个比较实用的数据结构。 之前听老师在课上提到过一次, 在那之前很早就听过这个, 也是一只因为懒没去真正了解。 趁着这两天空闲时间把它熟悉了一下, 发现并不难。(难度和二分查找的变式差不多吧)下面进入正题。 LeetCode

Guo15331092的博客 7636
上一篇: 7. Reverse Integer (E)
下一篇: 马拉车算法 Manacher
绿色小光头
博客等级 码龄10年 10粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值