- 浏览: 543657 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
一、 并查集: (union-find sets)
一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。
并查集的三种操作 :
1 、Make_Set(x) 把每一个元素初始化为一个集合
初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身(也可以根据情况而变)。
2 、Find_Set(x) 查找一个元素所在的集合
查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!这个才是并查集判断和合并的最终依据。
判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。
合并两个集合,也是使一个集合的祖先成为另一个集合的祖先,具体见示意图
3 、Union(x,y) 合并x,y所在的两个集合
合并两个不相交集合操作很简单:
利用Find_Set找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先。如图
并查集的优化
1
、Find_Set(x)时 路径压缩
寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度,有没有办法减小这个复杂度呢?
答案是肯定的,这就是路径压缩,即当我们经过"递推"找到祖先节点后,"回溯"的时候顺便将它的子孙节点都直接指向祖先,这样以后再次Find_Set(x)时复杂度就变成O(1)了,如下图所示;可见,路径压缩方便了以后的查找。
2
、Union(x,y)时 按秩合并
即合并的时候将元素少的集合合并到元素多的集合中,这样合并之后树的高度会相对较小。
二、举例——《编程之美》P205 区间重合判断
#include <iostream> using namespace std; /* 测试数据: 1 6 2 3 1 2 3 9 0 0 */ //区间重合判断,并查集求解 //家丁输入为整数,范围是n<=1000 const int NUMRANGE=1001; int rank[NUMRANGE]; int p[NUMRANGE]; void MakeSet(int x){ p[x]=x; rank[x]=0; } int FindSet(int x){ if(x!=p[x]){ p[x]=FindSet(p[x]);//回溯时压缩路径(将路径上所有节点父亲都赋予最终祖先) } return p[x]; } void Union(int x,int y){ x=FindSet(x); y=FindSet(y); //此后,x,y是两个集合的最终祖先! if(x==y) return; if(rank[x]>rank[y]){ p[y]=x; }else if(rank[x]<rank[y]){ p[x]=y; }else{ //rank[x]==rank[y] p[x]=y;//此时随便啦^^ rank[y]++; } } int main(){ /* 1. 不连续的区间属于不同集合 2. [0,2]区间在集合中有三个顶点:0,1,2 */ int i; for(i=0;i<=1000;i++) MakeSet(i); int oriBg,oriEnd,tempBg,tempEnd; cin>>oriBg>>oriEnd; while(cin>>tempBg>>tempEnd){ //0 0结束 if(tempBg==0 && tempEnd==0) break; int j; for(j=tempBg;j<tempEnd;j++) Union(j,j+1); } //判断[oriBg,oriEnd]是否在目标区间内 if(FindSet(oriBg)==FindSet(oriEnd)) cout<<"在区间内"<<endl; else cout<<"不在!"<<endl; }
发表评论
-
快排备忘
2013-10-26 11:27 583http://hi.baidu.com/pluto455988 ... -
LRU简单实现C++
2013-10-17 10:52 4027页面置换算法: 在地址映射过程中,若在页面中发现所要访问的页 ... -
二叉树相关
2013-10-04 17:40 727本节主要是为了写二叉树类型题目练手的代码,重点培养运用“指针 ... -
双指针策略(《编程之美》3.5 最短摘要生成)
2013-03-26 15:17 2252本文源自《编程之美》3.5 最短摘要生成一课。 ... -
K-MEDOIDS聚类算法
2012-12-04 21:18 2001k-medoids聚类算法 (wiki上讲得很清楚啊:) ) ... -
搜索(三)——回溯
2012-11-23 15:23 1055一、回溯 和 深度搜索 ... -
哈希Hash
2012-11-21 14:42 1008要点一:哈希表长度 的确定是个两难的问题:太短则容 ... -
状态压缩DP
2012-11-14 20:27 759引例、 例1、 例2、 例3、 ... -
模拟退火
2012-10-28 16:34 1233引用:http://www.cnblogs.com/heaad ... -
计算几何(一)——基础算法
2012-07-12 21:07 1932待续 《计算几何资料》为提纲 1. (1) 有向线段 ... -
计算几何(二)——平面最近点对
2012-07-12 10:54 922参考资料: 为何这个问题采用分治法 http://blog ... -
气泡滚大——剔除线性数据中的杂质
2012-06-18 09:43 972这是一道Java的面试题,但是我总结了除了一种自称为“ ... -
深入理解二分查找(二、二分答案)
2012-04-29 16:24 7218二分答案 如果已知候选答案的范围[min,max ... -
P问题、NP问题和NPC问题
2012-04-25 16:36 1081这篇文章转自这里 ... -
RMQ(Range Minimum/Maximum Query)区间最值查询
2012-04-18 20:47 1579一、RMQ问题描述 和 几种解题思路 RMQ问题 (Rang ... -
后缀数组
2012-04-16 09:49 1539一、后缀数组 及其对应的名次数组 举例:S=&quo ... -
大整数运算(部分转载)
2012-04-12 21:36 1204待补充:“浮点数高精度运算” 参见这里==> ... -
单向链表相关
2012-04-10 16:42 995单向链表是微软笔试常考的,参考这里:http://www.c ... -
关键路径(AOE)
2012-04-10 08:05 1684前面这段话是引用别人的,后面代码是自己写的,有待完善: ... -
搜索(二)——双向BFS
2012-03-24 17:18 3037参考这篇文章,以下前 ...
相关推荐
并查集是一种用于处理集合合并与查询的抽象数据类型,主要应用于解决元素分组和连接的问题。在C语言中,可以使用树结构,也就是父指针表示法来实现并查集。下面我们将详细讨论并查集的核心操作以及如何用树结构进行...
### Oracle 常用查询举例详解 #### 一、设置查询环境 **1. 设置查询显示格式** 在进行Oracle查询时,我们常常需要调整查询结果的显示格式来满足不同的需求。例如,我们可以使用 `desc table` 命令来查看表的结构...
根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是SQL中的多表查询技术,具体涉及到了左连接(Left Join)、右连接(Right Join)、内连接(Inner Join)以及全连接(Full Outer Join)。...
- `(pattern)` 匹配 pattern 并捕获匹配结果。 - `(?:pattern)` 匹配 pattern 但不捕获匹配结果。 - 示例: - `'(dog|cat)'` 可以捕获 "dog" 或 "cat"。 - `'(?:dog|cat)'` 仅匹配 "dog" 或 "cat",但不会捕获...
常见的JOIN类型有INNER JOIN(只返回匹配的行),LEFT JOIN(返回左表所有行及右表匹配的行),RIGHT JOIN(返回右表所有行及左表匹配的行),FULL JOIN(返回两个表的所有行,即使某一边没有匹配项)。 7. **UNION...
映射文件则定义了SQL语句和结果集的映射规则,使得Java对象与数据库表之间可以进行透明的转换。SqlSession提供了执行SQL和获取结果的方法,而Mapper接口则用于在业务逻辑层调用SQL。 在MySQL应用举例中,首先我们...
在"ADO C++源码及调用举例"中,我们将会探讨以下几个关键知识点: 1. **ADO基础概念**:ADO的核心是Connection、Command、Recordset、Parameter和Error等对象,它们分别代表数据库连接、命令执行、数据集、参数和...
测试人员应检查数据类型、字符集、长度限制、空输入、参数必要性、重复输入和数值范围。例如,对于字符串,需要确认是否允许特定的字符和空格。 2. **访问控制问题**:测试应关注用户身份验证和权限管理。通过复制...
存储过程是一组预编译的PL/SQL语句,可以接受参数并返回结果。函数类似,但必须返回一个值。存储过程和函数提高了代码的重用性和性能。 九、触发器 触发器是一种特殊的存储过程,会在特定的数据库事件(如INSERT、...
在MySQL数据库管理中,执行计划是优化SQL查询性能...对于大型数据集,这些优化措施尤其关键,因为它们直接影响到系统的响应时间和资源消耗。因此,学习并掌握分析执行计划的能力是每个数据库管理员和开发者的必备技能。
本话题主要探讨如何使用SQL报表来处理多维数据集,并通过商业智能工具实现增量处理,以提高数据处理速度和效率。以下是关于这个主题的详细解释。 一、多维数据集 多维数据集是数据仓库中的一个关键组成部分,它将...
1. **创建 `SqlDataAdapter`**:首先需要创建一个 `SqlDataAdapter` 实例,并指定查询命令(如 `SELECT * FROM [表名]`)。 2. **创建 `SqlCommandBuilder`**:接着使用 `SqlCommandBuilder` 的构造函数,传入 `...
### bbf算法的详细介绍与应用举例 #### 一、引言 在计算机视觉领域,特别是形状索引(Shape Indexing)技术中,一种名为“Best Bin First”(BBF)的搜索算法因其在高维特征空间中的高效表现而受到广泛关注。本文...
1.1 模糊集理论:模糊查询基于模糊集理论,该理论由Lotfi Zadeh于1965年提出,它扩展了传统集合论,允许元素具有不同程度的属于集合的属性。 1.2 模糊匹配:模糊匹配是指在比较字符串时,考虑相似性而非精确相等。这...
游标是SQL中的一种机制,它允许我们逐行处理查询结果集,就像在其他编程语言中使用指针遍历数组一样。在SQL中,游标主要用于处理交互式数据或者需要按顺序执行一系列操作的情况,例如在给定的例子中,我们需要根据...
3. ROW、PAGE与簇集索引:理解不同存储格式对查询性能的影响,如ROW模式在插入和更新时可能更高效。 总结,MySQL优化是一个涉及多方面的工作,需要综合考虑数据库设计、查询编写、服务器配置和存储引擎选择等因素。...
3. **并查集**:为了检查新加入的边是否会形成环路,我们需要使用并查集数据结构。并查集能高效地处理查找和连接两个操作,确保在连接两个节点时不会将它们归并到同一个集合中,如果已经属于同一集合,则说明形成了...
给出了在日常工作中常见的配置和维护命令,并针对性的对命令进行注释,作为维护命令集速查手册,不同于产品手册,将重点对维护和配置中的常用命令进行说明和举例,可以作为用户和工程师在基本的维护工作中的一个帮助...
并查集是一种处理元素集合合并及查询所属关系的高效数据结构。它支持两种基本操作:查找(Find)和合并(Union)。并查集通常用于图论中的连通性问题,如判断一组元素是否属于同一个集合。 ### 哈希表 哈希表是一种...
- 示例:`SELECT department, AVG(salary) FROM employees GROUP BY department` 按部门分组并计算每个部门的平均薪资。 11. **HAVING**: 用于过滤GROUP BY产生的结果集。 - 示例:`SELECT department, COUNT(*) ...