zoukankan      html  css  js  c++  java
  • 并查集路径压缩方法

           使用并查集查找时,如果查找次数很多,那么使用朴素版的查找方式肯定要超时。比如,有一百万个元素,每次都从第一百万个开始找,这样一次运算就是10^6,如果程序要求查找个一千万次,这样下来就是10^13,肯定要出问题的。

      这是朴素查找的代码,适合数据量不大的情况:

    int findx(int x)
    {
    int r=x;
    while(parent[r] !=r)
    r
    =parent[r];
    return r;
    }

       

        下面是采用路径压缩的方法查找元素:

    int find(int x)       //查找x元素所在的集合,回溯时压缩路径
    {
    if (x != parent[x])
    {
    parent[x]
    = find(parent[x]); //回溯时的压缩路径
    } //从x结点搜索到祖先结点所经过的结点都指向该祖先结点
    return parent[x];
    }

        

        上面是一采用递归的方式压缩路径, 但是,递归压缩路径可能会造成溢出栈,我曾经因为这个RE了n次,下面我们说一下非递归方式进行的路径压缩:

    int find(int x)
    {
    int k, j, r;
    r
    = x;
    while(r != parent[r]) //查找跟节点
    r = parent[r]; //找到跟节点,用r记录下
    k = x;
    while(k != r) //非递归路径压缩操作
    {
    j
    = parent[k]; //用j暂存parent[k]的父节点
    parent[k] = r; //parent[x]指向跟节点
    k = j; //k移到父节点
    }
    return r; //返回根节点的值
    }

       

        如有错误,欢迎指正!

        作者:VonGang   

         转载请注明出处  http://www.cnblogs.com/vongang/

  • 相关阅读:
    ZOJ 2859 Matrix Searching
    URAL 1102. Strange Dialog
    ZOJ 1986 Bridging Signals
    POJ 3233 Matrix Power Series
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    ZOJ 3471 Most Powerful
    IIS:HTTP 错误 403.9 禁止访问:连接的用户过多
    使用Command对象执行数据库操作
    C#类型转换
  • 原文地址:https://www.cnblogs.com/vongang/p/2122763.html
Copyright © 2011-2022 走看看