第12章 并查集

合集下载

清华简《系年》12-15章解析

清华简《系年》12-15章解析

清华简《系年》12~15章解析子居第十二章楚庄王立十又四年,王会诸侯于厉,郑成公自厉逃归,庄王遂加郑乱。

晋成公会诸侯以救郑,楚师未还,晋成公卒于扈。

整理者言:“厉,国名,在今湖北随州东北,或作‘赖’。

王夫之《春秋稗疏》则以为在今河南鹿邑东。

楚庄王十四年会诸侯于厉一事,《春秋》宣公九年未能明记,以致后代学者多有误会。

”①孙飞燕《释〈左传〉的“厉之役”》②一文于“厉之役”非杜注宣公六年事有详说,本文只略作补充。

宋人叶梦得在《春秋三传谳》中已辨“厉之役”杜预之注为非,其《左传谳》卷四言:“按《经》及《传》前皆无厉役之事,杜预以六年楚人伐郑取成而还当之,然《传》本不言厉,何以知其即此役?十一年《传》言厉之役,郑伯逃归。

杜预复指前六年事,皆无据,特附会以成其说尔。

且既取成而还,则何罪复伐?此书在九月晋侯、宋公、卫侯、郑伯、曹伯会于扈之后,盖郑既与楚成,复叛而从晋,故讨之。

是以十一年辰陵之盟,郑子良曰:‘晋楚不务德而兵争,与其来者可也。

’乃从楚是矣。

《传》盖横出厉役事以相乱也。

”①《清华大学藏战国竹简(贰)下册》第163页注一,中西书局,2011年12月。

②《深圳大学学报(人文社会科学版)》第29卷第2期,2012年3月。

厉地,整理者已提到“王夫之《春秋稗疏》则以为在今河南鹿邑东”,王夫之《春秋稗疏》卷上言:“厉,古与赖通。

《公羊释文》音赖,是已。

此所伐之厉,即楚围所灭之赖也。

老子生于苦县之厉乡,一曰赖乡,地在考城、鹿邑、亳州之间。

齐移救徐之师,西向伐厉,厉与楚而病徐也。

杜氏乃谓义阳随县北之厉乡。

随州之厉,乃神农所生之厉山,亦曰烈山,非国也。

齐桓帅八国之兵以伐楚,尚次陉而不深入,安能轻率一曹,越江汉之北而向随乎?且随为随侯之国,非厉国明矣。

于时随方率汉东诸侯叛楚,齐所宜招徕者,何为远涉以伐之邪?”所辨甚确,故此后沈钦韩《春秋左传地名补注》、程发轫《春秋左传地名图考》、杨伯峻《春秋左传注》等书皆从其说。

且《春秋·昭公四年》载:“秋七月,楚子、蔡侯、陈侯、许男、顿子、胡子、沈子、淮夷伐吴,执齐庆封,杀之。

整理符号表_变量符号说明

整理符号表_变量符号说明

符号表整理表姓名:职业工种:申请级别:受理机构:填报日期:变量符号说明福州大学2015 年硕士研究生入学考试专业课课程(考试)大纲1.考试科目名称: 《数据结构与程序设计》2.招生学院:数学与计算机科学(软件)学院说明:1、考试基本内容:一般包括基础理论、实际知识、综合分析和论证等几个方面的内容。

有些课程还应有基本运算和实验方法等方面的内容。

字数一般在300字左右。

2、难易程度:根据大学本科的教学大纲和本学科、专业的基本要求,一般应使大学本科毕业生中优秀学生在规定的三个小时内答完全部考题,略有一些时间进行检查和思考。

排序从易到难。

目录第1章编译器概述第2章词法分析2.1 词法记号及属性2.1.1 词法记号、模式、词法单元2.1.2 词法记号的属性2.1.3 词法错误2.2 词法记号的描述与识别2.2.1 串和语言2.2.2 正规式2.2.3 正规定义2.2.4 状态转换图2.3 有限自动机2.3.1 不确定的有限自动机2.3.2 确定的有限自动机2.3.3 NFA到DFA的变换2.3.4 DFA的化简2.4 从正规式到有限自动机2.5 词法分析器的生成器第3章语法分析3.1 上下文无关文法3.1.1上下文无关文法的定义3.1.2 推导3.1.3 分析树3.1.4 二义性3.2 语言和文法3.2.1 正规式和上下文无关文法的比较3.2.2分离词法分析器的理由3.2.3 验证文法产生的语言3.2.4 适当的表达式文法3.2.5 消除二义性3.2.6 消除左递归3.2.7 提左因子3.2.8 非上下文无关的语言结构3.2.9 形式语言鸟瞰3.3 自上而下分析3.3.1 自上而下分析的一般方法3.3.2 LL(1)文法3.3.3 递归下降的预测分析3.3.4 非递归的预测分析3.3.5 构造预测分析表3.3.6 预测分析的错误恢复3.4 自下而上分析3.4.1 归约3.4.2 句柄3.4.3 用栈实现移进-归约分析3.4.4 移进-归约分析的冲突3.5 LR分析器3.5.1 LR分析算法3.5.2 LR文法和LR分析方法的特点3.5.3 构造SLR分析表3.5.4 构造规范的LR分析表3.5.5 构造LALR分析表3.5.6 非LR的上下文无关结构3.6 二义文法的应用3.6.1 使用文法以外的信息来解决分析动作的冲突3.6.2特殊情况产生式引起的二义性3.6.3 LR分析的错误恢复3.7 分析器的生成器3.7.1 分析器的生成器Yacc3.7.2 用Yacc处理二义文法3.7.3 Yacc的错误恢复第4章语法制导的翻译4.1 语法制导的定义4.1.1 语法制导定义的形式4.1.2 综合属性4.1.3 继承属性4.1.4 属性依赖图4.1.5 属性计算次序4.2 S属性定义的自下而上计算4.2.1 语法树4.2.2 构造语法树的语法制导定义4.2.3 S属性的自下而上计算4.3 L属性定义的自上而下计算4.3.1 L属性定义4.3.2 翻译方案4.3.3 预测翻译器的设计4.3.4 用综合属性代替继承属性4.4 L属性的自下而上计算4.4.1 删除翻译方案中嵌入的动作4.4.2 分析栈上的继承属性4.4.3 模拟继承属性的计算4.5 递归计算4.5.1 自左向右遍历4.5.2 其他遍历方法4.5.3 多次遍历第5章类型检查5.1 类型在程序设计语言中的作用5.1.1 引言5.1.2 执行错误和安全语言5.1.3 类型化语言的优点5.2 描述类型系统的语言5.2.1 定型断言5.2.2 定型规则5.2.3 类型检查和类型推断5.3 简单类型检查器的说明5.3.1 一个简单的语言5.3.2 类型系统5.3.3 类型检查5.3.4 类型转换*5.4 多态函数5.4.1 为什么要使用多态函数5.4.2 类型变量5.4.3 一个含多态函数的语言5.4.4 代换、实例和合一5.4.5 多态函数的类型检查5.5 类型表达式的等价5.5.1 类型表达式的结构等价5.5.2 类型表达式的名字等价5.5.3 记录类型5.5.4 类型表示中的环5.6 函数和算符的重载5.6.1 子表达式的可能类型集合5.6.2 缩小可能类型的集合第6章运行时存储空间的组织和管理6.1 局部存储分配策略6.1.1 过程6.1.2 名字的作用域和绑定6.1.3 活动记录6.1.4 局部数据的安排6.1.5 程序块6.2 全局存储分配策略6.2.1 运行时内存的划分6.2.2 静态分配6.2.3 栈式分配6.2.4 堆式分配6.3 非局部名字的访问6.3.1 无过程嵌套的静态作用域6.3.2 有过程嵌套的静态作用域6.3.3 动态作用域6.4 参数传递6.4.1值调用6.4.2 引用调用6.4.3 复写-恢复调用6.4.4 换名调用第7章中间代码生成7.1 中间语言7.1.1 后缀表示7.1.2 图形表示7.1.3 三地址代码7.2 声明语句7.2.1 过程中的声明7.2.2 作用域信息的保存7.2.3 记录的域名7.3 赋值语句7.3.1 符号表中的名字7.3.2 临时名字的重新使用7.3.3 数组元素的地址计算7.3.4 数组元素地址计算的翻译方案7.3.5 类型转换7.4 布尔表达式和控制流语句7.4.1 布尔表达式的翻译7.4.2 控制流语句的翻译7.4.3 布尔表达式的控制流翻译7.4.4 开关语句的翻译7.4.5 过程调用的翻译第8章代码生成8.1 代码生成器设计中的问题8.1.1 目标程序8.1.2 指令选择8.1.3 寄存器分配8.1.4 计算次序选择8.2 目标机器8.2.1 目标机器的指令系统8.2.2 指令的代价8.3 基本块和流图8.3.1 基本块8.3.2 基本块的变换8.3.3 流图8.3.4 下次引用信息8.4 一个简单的代码生成器8.4.1 寄存器描述和地址描述8.4.2 代码生成算法8.4.3 寄存器选择函数8.4.4 为变址和指针语句产生代码8.4.5 条件语句*第9章代码优化9.1 优化的主要种类9.1.1 代码改进变换的标准9.1.2 公共子表达式删除9.1.3 复写传播9.1.4 死代码删除9.1.5 代码外提9.1.6 强度削弱和归纳变量删除9.1.7 优化编译器的组织9.2 流图中的循环9.2.1 必经结点9.2.2 自然循环9.2.3 前置结点9.2.4 可归约流图9.3 全局数据流分析介绍9.3.1 点和路径9.3.2 到达-定值9.3.3 可用表达式9.3.4 活跃变量分析9.4 代码改进变换9.4.1公共子表达式删除9.4.2复写传播9.4.3 寻找循环不变计算9.4.4 代码外提9.4.5 归纳变量删除第10章编译系统和运行系统10.1 C语言的编译系统10.1.1 预处理器10.1.2 汇编器10.1.3 连接器10.1.4 目标文件的格式10.1.5 符号解析10.1.6 静态库10.1.7 可执行目标文件及装入10.1.8 动态连接10.1.9 处理目标文件的一些工具10.2 Java语言的运行系统10.2.1 Java虚拟机语言简介10.2.2 Java虚拟机10.2.3即时编译器*10.3 无用单元收集10.3.1 标记和清扫10.3.2 引用计数10.3.3 拷贝收集10.3.4 分代收集10.3.5 渐增式收集10.3.6 编译器与收集器之间的相互影响*第11章面向对象语言的编译11.1 面向对象语言的概念11.1.1 对象和对象类11.1.2 继承11.1.3 信息封装11.2 方法的编译11.3 继承的编译方案11.3.1 单一继承的编译方案11.3.2 重复继承的编译方案*第12章函数式语言的编译12.1 函数式程序设计语言简介12.1.1 语言构造12.1.2 参数传递机制12.1.3 变量的自由出现和约束出现12.2 函数式语言的编译简介12.2.1 几个受启发的例子12.2.2 编译函数12.2.3 环境与约束12.3 抽象机的系统结构12.3.1 抽象机的栈12.3.2 抽象机的堆12.3.3 名字的寻址12.3.4 约束的建立12.4 指令集和编译12.4.1 表达式12.4.2 变量的引用性出现12.4.3 函数定义12.4.4 函数应用12.4.5 构造和计算闭包12.4.6 letrec表达式和局部变量整理丨尼克本文档信息来自于网络,如您发现内容不准确或不完善,欢迎您联系我修正;如您发现内容涉嫌侵权,请与我们联系,我们将按照相关法律规定及时处理。

三体第十二章概括

三体第十二章概括

三体第十二章概括
汪淼穿上VR装备再次登录《三体》游戏。

游戏里遇到了一个人物叫墨子,墨子认出了汪淼的角色,告诉他在他离开的这段时间,文明重新启动了4次,在乱纪元和恒纪元的混乱交替中,139号文明创造了纪录走到了蒸汽时代。

墨子造了一个精巧的宇宙模型机器,模拟三个太阳的运行,他认为自己找到了规律,而且觉得汪淼总提的“飞星”只是意外,不必在意。

但最后果然如汪淼所说,墨子的推理仍然是错误的,巨大的烈焰吞噬了这个文明,游戏结束。

三体第一部第八章标题是叶文洁,主要讲述了汪淼通过VR游戏了解到《三体》的海量信息是隐藏在深处的,汪淼能感觉到,但说不清。

《三体》的不寻常在于,与其他的游戏相比,它的设计者是反其道而行之——一般游戏的设计者都是尽可能地增加显示的信息量,以产生真实感:但《三体》的设计者却是在极力压缩信息量,以隐藏某种巨大的真实,就像那张看似空旷的天空照片。

然后汪淼去拜访了杨冬的母亲叶文洁,参观了杨冬的房间,与叶文洁一起回忆杨冬活着时从小到大的一点一滴,最后还向杨母了解了观测宇宙背景辐射的事。

三体第一部第9章内容梗概:叶文洁遭受迫害下放大兴安岭,来到红岸基地,并于1971年秋天的一个下午向太阳发射信号,将电波传播到宇宙深处。

马可福章12章逐节解释

马可福章12章逐节解释

马可福章12章逐节解释篇一:马可福章(Markus Fuchs)是一位德国化学家,他在20世纪60年代开始研究碳纳米管。

他于1969年发表了第一篇关于碳纳米管的研究论文,并在此后的几十年里持续深入研究,成为了碳纳米管领域的先驱者和重要人物之一。

以下是马可福章的12章逐节解释,包括了碳纳米管的基本概念、物理性质、制备方法、表征方法等方面的内容。

第一章:碳纳米管的概念本章介绍了碳纳米管的概念和定义。

碳纳米管是一种由碳原子组成的多孔、多裂缝的碳材料,其直径通常只有几个到几十纳米。

碳纳米管具有许多独特的物理和化学性质,如高比表面积、强大的机械强度、优异的导电性、热稳定性等,因此在纳米材料研究领域具有广泛的应用前景。

第二章:碳纳米管的结构和形态本章介绍了碳纳米管的结构和形态。

碳纳米管通常由一个碳原子的孤对电子与相邻的碳原子形成共价键,形成多孔、多裂缝的碳材料。

碳纳米管的形态包括晶体形态、树枝状形态、球状形态等。

其中,晶体形态是碳纳米管最常见的形态,树枝状形态和球状形态也可以通过控制碳纳米管的结构和尺寸来实现。

第三章:碳纳米管的制备方法本章介绍了碳纳米管的制备方法。

碳纳米管的制备方法包括化学气相沉积、物理气相沉积、电化学沉积、化学溶解法等。

其中,化学气相沉积是最常用的制备方法之一,它通过将碳材料溶解在沉积剂中,然后通过气相沉积技术将其沉积到基材表面。

第四章:碳纳米管的表征方法本章介绍了碳纳米管的表征方法。

碳纳米管的表征方法包括光学显微镜、电子显微镜、X射线衍射、核磁共振、激光扫描隧道显微镜等。

其中,光学显微镜是最常用的表征方法之一,它可以通过观察碳纳米管的孔径、结构、形态等特征来评估碳纳米管的质量和尺寸。

篇二:马可福章(Markus Fuchs)是德国著名的数学家和物理学家,他在数学和物理学领域做出了许多杰出的贡献。

以下是他第12章逐节解释的内容。

第1节:基本几何学这一章主要介绍了几何学的基本概念和定理。

马可福章指出,几何学是物理学的基础,因为它提供了描述自然现象的一种重要工具。

数据结构考研笔记整理(全)

数据结构考研笔记整理(全)

数据结构考研笔记整理(全)一、第二章线性表●考纲内容●一、线性表的基本概念●线性表是具有相同数据结构类型的n个数据元素的有限序列;线性表为逻辑结构,实现线性表的存储结构为顺序表或者链表●二、线性表的实现●1、顺序表●定义(静态分配)●#define MaxSize 50 \\ typedef struct{ \\ ElemType data[MaxSize];\\ intlength;\\ }SqList;●定义(动态分配)●#define MaxSize 50\\ typedef strcut{\\ EleType *data; //指示动态非配数组的指针\\ int MaxSize,length;\\ }SqList;●c的动态分配语句为L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);●c++动态分配语句为L.data=new ElemType[InitSize];●插入操作●删除操作●按值寻找●2、链表●单链表●单链表的定义●●头插法建立单链表●●尾插法建立单链表●●按序号查找getElem(LinkList L,int i)和按值查找locateElem(LinkListL,ElemType e)●插入结点(后插)●p=getElem(L,i-1); //查找插入位置的前驱结点\\ s.next=p.next;\\p.next=s;●将前插操作转化为后插操作,即先将s插入的p的后面然后调换s和p的数据域●s.next=p.next;\\ p.next=s.next;\\ temp=p.data;\\ p.data=s.data;\\s.data=temp;●删除结点●p.getElem(L,i-1);\\ q=p.next;\\ p.next=q.next;\\ free(q);●双链表(结点中有prior指针和next指针)●循环链表●静态链表●借助数组来描述线性表的链式存储结构,结点中的指针域next为下一个元素的数组下标●三、线性表的应用●使用的时候如何选择链表还是顺序表?●表长难以估计,经常需要增加、删除操作——链表;表长可以估计,查询比较多——顺序表●链表的头插法,尾插法,逆置法,归并法,双指针法;顺序表结合排序算法和查找算法的应用●小知识点(选择题)二、第三章栈,队列和数组●考纲内容●一、栈和队列的基本概念●栈:后进先出,LIFO,逻辑结构上是一种操作受限的线性表●队列:先进先出,FIFO,逻辑结构上也是一种操作受限的线性表●二、栈和队列的顺序存储结构●栈的顺序存储●●队列的顺序存储●进队:队不满时,送值到队尾元素,再将队尾指针加一●出队:队不空时,取队头元素值,再将队头指针加一●判断队空:Q.front==Q.rear==0;●循环队列(牺牲一个单元来区分队空和队满,尾指针指向队尾元素的后一个位置,也就是即将要插入的位置)●初始:Q.front==Q.rear●队满:(Q.rear+1)%MaxSize=Q.front●出队,队首指针进1:Q.front=(Q.front+1)%MaxSize●入队,队尾指针进1:Q.rear=(Q.rear+1)%MaxSize●队列长度:(Q.rear+MaxSize-Q.front)%MaxSize●三、栈和队列的链式存储结构●栈的链式存储●●队列的链式存储●实际是上一个同时带有头指针和尾指针的单链表,尾指针指向单链表的最后一个结点,与顺序存储不同,通常带有头结点●四、多维数组的存储●行优先:00,01,02,10,11,12●列优先:00,10,01,11,02,12●五、特殊矩阵的压缩存储●对称矩阵●三角矩阵●三对角矩阵(带状矩阵)●稀疏矩阵●将非零元素及其相应的行和列构成一个三元组存储●十字链表法●六、栈、队列、数组的应用●栈在括号匹配中的应用●栈在递归中的应用●函数在递归调用过程中的特点:最后被调用的函数最先执行结束●队列在层次遍历中的应用●二叉树的层次遍历●1跟结点入队●2若队空,则结束遍历,否则重复3操作●3队列中的第一个结点出队并访问,若有左孩子,则左孩子入队;若有右孩子,则右孩子入队●重点为栈的(出入栈过程、出栈序列的合法性)和队列的操作及其特征●小知识点(选择题)●n个不同元素进栈,出栈元素不同排列的个数为{2n\choose n }/(n+1)●共享栈是指让两个顺序栈共享一个存储空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸,可以更有效的利用存储空间,同时对存储效率没有什么影响●双端队列是指允许两端都可以进行入队和出队操作的队列●输出受限的双端队列:允许两端插入,只允许一端删除●输入受限的双端队列:允许两端删除,只允许一端插入三、第四章串●考纲内容●字符串模式匹配●暴力算法●注意指针回退时的操作是i=i-j+2;j=j+1;●kmp算法●手工求next数组时,next[j]=s的最长相等前后缀长度+1,其中s为1到j-1个字符组成的串●在实际kmp算法中,为了使公式更简洁、计算简单,如果串的位序是从1开始的,则next数组需要整体加一;如果串的位序是从0开始的,则next数组不需要加一●根据next数组求解nextval数组:如果p[j]==p[next[j]],则nextval[j]=nextval[next[j]],否则nextval[j]=next[j];●小知识点●串和线性表的区别:1线性表的数据元素可以不同,但串的数据元素一般是字符;2串的操作对象通常是子串而不是某一个字符四、第五章树与二叉树●考纲内容●一、树的基本概念●定义●树是一种递归的数据结构,是一种逻辑结构●树的性质●结点数为n,则边的数量为n-1●树中的结点数等于所有结点的度数之和加1(一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度,每一条边表示一个结点,对应一个度,只有根结点上面无边,故结点树=度数之和+1)●度为m的树中第i层至多有m^{i-1}个结点(i\geq1)(m叉树的第i层最多有m^{i-1}个结点)●高度为h的m叉树至多有(m^h-1)/(m-1)个结点(假设每一个结点都有m个孩子,则由等比数列的求和公式可以推导出该式子)●具有n个结点的m叉树的最小高度是\lceil log_m(n(m-1)+1)\rceil(由高度为h的m叉树的最大结点树公式有,n满足式子(m^{h-1}-1)/(m-1) \leq n\leq (m^h-1)/(m-1))●高度为h的m叉树至少有h个结点;高为h,度为m的树至少有h+m-1个结点(m叉树并不等于度为m的树,m叉树可以为空树,要求所有结点的度小于等于m,而度为m的树一定有一个结点的度数为m)●二、二叉树●二叉树的定义及其主要特征●定义●特点●每个结点至多只有两颗子树●二叉树是有序树,其子树有左右之分,次序不能颠倒,否则将成为另一颗二叉树,即使树中结点只有一颗子树,也要区分他是左子树还是右子树●特殊的二叉树●满二叉树:高度为h,结点数为2^h-1,所有叶子结点都集中在二叉树的最下面一层,除叶子结点外的所有结点度数都为2,从根结点为1开始编号,对于编号为i的结点,其父结点为\lfloor i/2 \rfloor,左孩子(若有)编号为2i,右孩子(若有)编号为2i+1,所以编号为偶数的结点只可能是左孩子,编号为奇数的结点只可能是右孩子●完全二叉树:删除了满二叉树中编号更大的结点,高为h,结点数为n的完全二叉树的每个结点的编号都与高度为h的满二叉树中编号为1到n的结点相同。

ACM培训大纲

ACM培训大纲

实用标准文案ACM培训大纲基础内容:数据结构——》搜索——》图论DP数论博弈中级内容数据结构网络流第一章搜索1.二分搜索三分搜索2.栈3.队列4.深搜5,广搜6.第二章数据结构1.优先队列并查集2.二叉搜索树3.线段树(单点更新)4.5.精彩文档.实用标准文案第三章图论1.图的表示1.1二维数组1.2邻接表1.3前向星2.图的遍历2.1双连通分量2. 2拓扑排序3.最短路3.1迪杰斯特拉3. 2弗洛伊德4. 3 SPFA5.匹配匈牙利算法6.生成树7.网络流简介第四章动态规划1.状态转移方程2.引入3. 1 0-1背包4.2硬币问题5. 3矩阵链乘6.区间DP7.按位DP8.树形DP9.状压DP第五章数论1.欧几里得扩展欧几里得2.因数分解3. 费马小定理4.欧拉定理5.6.1筛法6. 2素数判定6. 2,1 0(Jn)方法精彩文档.实用标准文案6. 2. 2 Mi I ler-rabin 测试第六章博弈1.Nim 和2.SG函数第七章中级数据结构1.树状数组RMO 2.KMP3.AC自动机4.线段树(区间更新)5.第八章图论进阶1.网络流问题精彩文档.实用标准文案综述在很多人眼里,东北大学秦皇岛分校不算是985高校。

所以我们要用自己的能力证明我们有985 的实力。

ACM是计算机界认可度最高的一个比赛,可以说只要区域赛有过奖牌,国内任何IT公司没有理由不要。

同时,在高校之中,对一个大学计算机专业的评价,大部分人也会首先看ACM 的水平。

将ACM打出学校,在国内打出一定成绩,对扩大我校影响力很有帮助。

考虑到本校暂时没有进行专题训练的出题能力,专题训练的题目主要从UESTC 2014年集训队专题训练中获取,再加上从别的0J上找一些题目。

训练的平台设置在华中科技大学的vertual judge上面。

本人将在毕业之前承担培训任务。

在2015学年开始之前,培训计划为每两周一次,中间空闲的时间由大二或者大一熟悉C++的同学给不熟悉C++的同学进行基础的讲解。

信息学奥赛一本通 第4章 第5节 并查集(C++版)

信息学奥赛一本通 第4章  第5节 并查集(C++版)

具体程序如下:
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 20001
int father[maxn];
int m,n,i,x,y,q;
/*
int find(int x)
/用非递归的实现
{
while (father[x] != x) x = father[x];
并查集的基本思想
优化的具体程序如下:
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 20001
int father[maxn];
int m,n,i,x,y,q;
/*
int find(int x)
//用非递归的实现
路径压缩实际上是在找完根结点之后,在递归回来的时候顺便把路径上元素的 父亲指针都指向根结点。
这就是说,我们在“合并5和3”的时候,不是简单地将5的父亲指向3,而是直 接指向根节点1,如图:
1
2
3
5
4
由此我们得到了一个复杂度几乎为常数的算法。
【程序清单】 (1)初始化:
for (i = 1; i <= n; i++) father[i] = i; 因为每个元素属于单独的一个集合,所以每个元素以自己作为根结点。
并查集的基本思想
(2)寻找根结点编号并压缩路径: int find (int x) { if (father[x] != x) father[x] = find (father[x]); return father[x]; }

海底两万里12章概括主要内容

海底两万里12章概括主要内容

海底两万里12章概括主要内容
《海底两万里》是法国作家儒勒·凡尔纳创作的科幻小说。

小说的故事主要发生在1866年,主人公是法国生物学家兼探险家阿龙纳斯。

小说分为12章,每章都讲述了阿龙纳斯与潜水员尼莫一起探索海底神秘世界的故事。

第一章介绍了作者凡尔纳的兴趣爱好,以及他在研究动物和植物方面的成果。

第二章介绍了尼莫的父亲是一名著名的潜水员,他们一起去深海寻找失踪的船只。

第三章介绍了海底的生态环境,包括海洋生物和海底地形。

第四章介绍了两个潜水员在海底洞穴里迷路,遇到了神秘的生物。

第五章介绍了两个潜水员被一只巨大的章鱼困住,他们利用工具破译了章鱼的密码。

第六章介绍了两个潜水员在海底森林中遇到了一群海豚,并与它们一起寻找食物。

第七章介绍了两个潜水员与一只巨大的鲸鱼相遇,他们一起探索鲸鱼的背部,并发现了一座神秘的海底城市。

第八章介绍了两个潜水员在海底草原上与一只巨大的龙虾相遇,他们一起去追逐龙虾,并意外发现了一艘古老的船只。

第九章介绍了两个潜水员在海底火山口与一只巨大的海龟相遇,他们一起去探索火山的洞穴。

第十章介绍了两个潜水员被困在一个神秘的海底实验室中,他们需要帮助才能逃脱。

第十一章介绍了两个潜水员与一只神秘的生物相遇,他们一起探索了深海,并最终回到人间。

第十二章介绍了两个潜水员在返航途中遇到了一些困难,但他们最终成功回到了岸边。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
第12章 并查集
学习要点: 理解以不相交的集合为基础的抽象数据类型并查集. 掌握用数组实现并查集的方法. 掌握用树结构实现并查集的方法. 理解将小树合并到大树的合并策略及其实现. 掌握路径压缩技术及其实现方法.
2008-6-24
福州大学数学与计算机科学学院
9
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
12.2 用父结点数组实现并查集
UFfind(e)运算就是从元素e相应的结点走到树根处,找出所在集合的名 字. int UFfind(int e, UFset U) { while (U->parent[e]) e = U->parent[e]; return e; } 合并2个集合,只要将表示其中一个集合的树的树根改为表示另一个集合的 树的树根的儿子. int UFunion(int i, int j, UFset U) { U->parent[j] = i; return i; } 容易看出,在最坏情况下,合并可能使n个结点的树退化成一条链.在这种 情况下对所有元素各执行一次Find将耗时O(n2).(见下页图)
2008-6-24 福州大学数学与计算机科学学院 4
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
在父亲数组表示中,第 i 个数组元素代表包含 集合元素 i 的树根结点.根结点的双亲为-1, 表示集合中的元素个数. 在同一棵树上所有结点所代表的集合元素在同一 个子集合中. 为此,需要有两个映射:
Union(3,4) 4
3 4
2 3
3 4
2 3
11
Union(2,3)
Union(1,2) Union(0,1)
2008-6-24 福州大学数学与计算机科学学院
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
2008-6-24
4 4 9 6 0 7 1 8
返回章目录
8
9
S1 ∪ S2的可能的表示方法
福州大学数学与计算机科学学院
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
12.2 用父结点数组实现并查集
typedef struct ufset * UFset; typedef struct ufset { int * parent; }UFS; 其中parent是表示树结构的父结点数组.元素x 的父结点为parent[x].
i =1 n
改进的方法
按树的结点个数合并 按树的高度合并 压缩元素的路径长度
2008-6-24 福州大学数学与计算机科学学院 12
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
按树结点个数合并 结点个数多的树的根结点作根
按树高度合并 高度高的树的根结点作根
0 -0 1 -0 2 2 3
2008-6-24
2
-0
3
-0
4
-0
5
-0 -2 2 3
6 2
-0
-2 1 2 4
-1 3 6 3
0 Union(2, 0) 0 5 1 2 4 3
2 6 3
0 5 0
14
福州大学数学与计算机科学学院
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
Algorithms and Data Structures Algorithms and Data Structures
12.3 并查集的应用—离线最小值问题
2008-6-24
福州大学数学与计算机科学学院
17
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
0 6 7 8 1
4 9 3
2 5
为简化讨论,忽略实际的集合名,仅用表示集合 的树的根来标识集合.
2008-6-24 福州大学数学与计算机科学学院 6
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
初始时, 用初始化函数 UFinit(size) 构造一个 森林, 每棵树只有一个结点, 表示集合中各元素 自成一个子集合. 用 UFfind(i) 寻找集合元素 i 的根.如果有两 个集合元素 i 和 j, UFfind(i) == UFfind(j), 表明这两个元素在同一个集合中. 如果两个集合元素 i 和 j 不在同一个集合中, 可用 UFunion(i, j, U) 将它们合并到一个集合 中.
返回章目录
2008-6-24 福州大学数学与计算机科学学院 2
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
12.1 并查集的定义及其简单实现
在一些应用问题中,需将n个不同的元素划分成一组不相 交的集合.开始时,每个元素自成一个单元素集合,然 后按一定顺序将属于同一组元素的集合合并.其间要反 复用到查询某个元素属于哪个集合的运算.适合于描述 这类问题的抽象数据类型称为并查集.
2008-6-24 福州大学数学与计算机科学学院 7
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
下标
0
1
2
3
4
5
6
7
8
9
parent -1
4
-1 2
-1 2
0
0 0
4
集合 S1, S2 和 S3 的父亲数组表示 0 6 7 8 1
2008-6-24
福州大学数学与计算机科学学院
3
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
并查集 (Union-Find Sets)
并查集支持以下两种操作: UFunion (A, B, U) //并操作 UFfind (e) //找出包含元素e的集合,并返 回该集合的名字 对于并查集来说,每个集合用一棵树表示. 为此,采用树的父亲数组表示作为集合存储表 示.集合元素的编号从0到 n-1.其中 n 是最大 元素个数.
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
第12章 并查集
12.1 并查集的定义及其简单实现 12.2 用父结点数组实现并查集 12.3 并查集的应用
2008-6-24
福州大学数学与计算机科学学院 吴英杰
0 -1 1 -1 2 2 3
2008-6-24
2-13来自-14-1
5
-1 -7 2 3
6 2
-1
-5 1 2 4
-2 3 6 3
0 Union(2, 0) 0 5 1 2 4 3
2 6 3
0 5 0
13
福州大学数学与计算机科学学院
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
福州大学数学与计算机科学学院 15
7
5
8
从 i = 5 压缩路径
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
12.3 并查集的应用—离线最小值问题
2008-6-24
福州大学数学与计算机科学学院
16
《算法与数据结构》
UFunion操作的折叠规则
为进一步改进树的性能,可以使用如下折叠规则来"压缩路 径".即:如果 j 是从 i 到根的路径上的一个结点,且 parent[j] ≠ root[j], 则把 parent[j] 置为 root[i].
0 6 1 3
2008-6-24
0 8 9 5 6 7 1 9 3
返回章目录
2008-6-24 福州大学数学与计算机科学学院 10
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
合并
3 4 -2 3
0
-1 2 3
1
-1
2
-1 1 2
3
-1
4
-1
0 1 2
-5 0 1
-3 2 3
-4 1
2008-6-24
福州大学数学与计算机科学学院
18
《算法与数据结构》
Algorithms and Data Structures Algorithms and Data Structures
THE
END
相关文档
最新文档