zoukankan      html  css  js  c++  java
  • 并查集

    1 int findx(int x)
    2 {
    3     if(x!=parent[x])
    4         parent[x]=findx(parent[x]);  //   回溯的时候压缩路径  这个是 压缩路径的精髓
    5     return parent[x];  //   实际上我也看不出来  到底哪里好 ......
    6 }
    7 son :       1 3 8 9
    8 parent :    1 1 3 8

    并查集有两个优化。

    一、按秩合并

    描述:就是在对两个不同子集连接时,按照rank来连,也就是rank低的连在rank高的下面。rank高的做父亲节点。

    作用,这样类似维护了一棵树,树是rank高的在上。

    二、路径压缩

    描述:假如fa数组已经嵌套了N层,那么传统的做法去找祖先要做N次,当N很大时,这种做法很没效率。

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

    int findx(int x)
    {
       while(parent[x]!=x)        //     如果 这不是掌门的话  继续执行  向上寻找的 过程   
            x=parent[x];      //       直到  找到掌门   然后  就开始返回  所有的 x 都变成 掌门的身份证号码  然后就返回了 
       return x;
    }

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

    /*      路径压缩 顾名思义  就是 将原来需要走的很长的 路径  很快的走过去  用跳跃来  相当于压缩     */

    int find(int x)
    {
        int k,j,r;      
        r = x;
        while(r != parent[r])       //  
            r = parent[r];
        k = x;        
        while(k != r)           
        {
            j = parent[k];       
            parent[k] = r;
            k = j;              
        }
        return r;            
    }
  • 相关阅读:
    C语言开发框架、printf(day02)
    Linux C(day01)
    线程同步、信号量、system v IPC
    UDP、线程、mutex锁(day15)
    Socket编程(day14)
    共享内存、网络(day13)
    pause、jobs、setitimer(2)、system v ipc(day12)
    PIPE、SIGNAL(day11)
    环境变量、system(day10)
    进程(day09)
  • 原文地址:https://www.cnblogs.com/A-FM/p/5285188.html
Copyright © 2011-2022 走看看