算法竞赛知识提要1

来源:互联网 发布:淘宝达人申请步骤 编辑:程序博客网 时间:2024/06/04 01:27

并查集

  1. 并查集是什么

    并查集是用来管理元素分组情况的数据结构。不过需要注意的是只能合并而不能拆分。因此,并查集所能做到的是查询元素之间是否同组以及将不同组合并为同一组。
    这里写图片描述

  2. 并查集结构

    并查集的组成是树形结构,但是并不是二叉树,我们不考虑节点的父亲以及树的形状细节,而关注的重点在于树的整体。

    1. 初始化
      我们准备n个节点来表示n个元素。最开始没有边。
    2. 合并
      从一个组的根向另一组的根连边。当然为了避免树状结构退化成链状,我们合并遵从下面的法则,记录每个组的树高rank,合并时如果两棵树高度不同,rank小的向大的连边。此外,路径压缩也是极为关键,由于并查集并不是二叉树结构,所以一旦在查询中,找到元素的根,那么直接就将该元素与根连边。
    3. 查询
      沿着树向上走,来查询包含这个元素的根是谁,如果两个元素的根一致,则同组。
  3. 并查集的实现
    并查集查询非常高,他的均摊复杂度(多次操作时间取平均)非常快,比logn还快。
 int par[max];  // 父亲 int rank[max]; // 树的高度void init(int n){     for(int i=0;i<n;i++){          par[i] = i;         rank[i] = 0;     }}int find(int x){    if(par[x]==x) return x;    else par[x] = find(par[x]); //将x的父亲直接连到根节点上,压缩光路}void unite(int x,int y){     if(x==y) return;     if(rank[x]<rank[y]) par[x] = y;     else if(rank[x]>rank[y]) par[y] = x;           else{           par[y] = x; rank[x]++; //根节点互联           }}bool theSame(int x,int y){     return find(x)==find(y);}
原创粉丝点击