算法模板——并查集 2(支持快速即时查询本连通块内容,纯原创!)
时间:2022-05-08
本文章向大家介绍算法模板——并查集 2(支持快速即时查询本连通块内容,纯原创!),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能:输入N,现在有N个数;接下来输入任意行,如果是"1 x y"则表示把x和y所在的块合并;如果是"2 x"则表示输出x所在的块的全部内容
原理:其实主要是自己创造了一个可并链line,he表示链头,ta表示链尾,然后对于不同块之间的合并就是直接把两条链对接,也就是一个的尾巴接到另一个的头上,构成新链(由于是链的直接叠加,所以可以做到严格的O(1),并且输出时输出多少复杂度就是多少,完全不存在额外复杂度)。然后同时用原本的普通数组并查集进行维护和追踪(理论值为O(logn)但实际上由于c[x]:=getfat(c[x])的优化导致实际测试结果远远小于这一复杂度)
复杂度:【合并操作O(1),查询O(块大小)(意味着复杂度几乎完全用来输出)】×N,相比于之前的算法对于即时处理的性能有所提高,但是只需要最终进行静态的全局处理时,两者差不太多,这个会略快些,传统程序代码略少些
(PS:值得注意的是,这种新的数据结构中千万要特判两个数字处于同一块的情况,必须避免同一条链首尾相接导致产生环!!!本程序41行continue那里有所体现。同时c[x]:=y之类的合并块语句以及merge(x,y)操作是有顺序之分的,两者顺序必须保持一致,不想原来的并查集顺序任意)
1 type
2 point=^node;
3 node=record
4 g:longint;
5 next:point;
6 end;
7 line=record
8 he,ta:point;
9 end;
10 var
11 a:array[0..100000] of line;
12 c:array[0..100000] of longint;
13 i,j,k,l,m,n:longint;
14 p:point;
15 procedure merge(var p1,p2:line);inline;
16 begin
17 p1.ta^.next:=p2.he;
18 p1.ta:=p2.ta;
19 p2.he:=nil;p2.ta:=nil;
20 end;
21 function getfat(x:longint):longint;inline;
22 begin
23 if x<>c[x] then c[x]:=getfat(c[x]);
24 exit(c[x]);
25 end;
26 begin
27 readln(n);
28 for i:=1 to n do
29 begin
30 c[i]:=i;
31 new(p);p^.g:=i;p^.next:=nil;
32 a[i].he:=p;a[i].ta:=p;
33 end;
34 while true do
35 begin
36 read(l);
37 case l of
38 1:begin
39 readln(j,k);
40 j:=getfat(j);k:=getfat(k);
41 if j=k then continue;
42 c[k]:=j;
43 merge(a[j],a[k]);
44 end;
45 2:begin
46 readln(j);
47 j:=getfat(j);
48 p:=a[j].he;
49 while p<>nil do
50 begin
51 write(p^.g,' ');
52 p:=p^.next;
53 end;
54 writeln;
55 end;
56 end;
57
58 end;
59 end.
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下tcpdump命令解析及使用详解
- react native中的聊天气泡及timer封装成的发送验证码倒计时
- 如何卸载linux自带openjdk并安装sun jdk
- Android中实现密码的隐藏和显示的示例
- CentOS8出现-bash:乱码问题及解决方法
- Android编程实现摄像头临摹效果的方法
- Android实现九宫格解锁的实例代码
- 详解Linux系统中虚拟设备文件的各种实用用法
- 适配android7.0获取文件的Uri的方法
- Android RecyclerView使用方法详解
- 详解bash中的初始化机制
- Android音频系统AudioTrack使用方法详解
- 深入解析Android中的setContentView加载布局原理
- Android编程之自定义ProgressBar示例
- Android自动获取输入短信验证码库AutoVerifyCode详解