1. 查找-合并算法
查找:检查两个对象是否属于同一个集合
合并:用一个集合替代两个对象分别对应的集合。
1.1. 快速查找
数据结构:使用一个大小为N的数组id[],p和q是连通的如果他们对应的id值一样。
例如:
节点: i 0 1 2 3 4 5 6 7 8 9
初始: id[i] 0 1 2 3 4 5 6 7 8 9
当前值:id[i] 0 1 9 9 9 6 6 7 8 9
根据当前值,可以看出0是一个集合,1是一个集合,2,3,4,9属于一个集合,5,6属于一个集合,7是一个集合,8是一个集合。
可以看出,5,6是连通的,2,3,4,9是连通的。
问题:节点3,6连通么?
查找操作:因为id[3]=9;id[6]=6,不相同,所以3,6是非连通的。
合并操作:对3,6节点对,.把所有和id[3]相同的id数组里元素值设为id[6].
结果:
i 0 1 2 3 4 5 6 7 8 9
id[i] 0 1 6 6 6 6 6 7 8 6
快速查找的方法:查找可在线性时间内完成,但是合并操作需要O(N)操作
因此,若执行M对节点的连通性的检查,需要O(MN)的操作。
1.2 快速合并
数据结构:使用一个大小为N的数组id[],id[i]表示的是节点i的父节点,节点i的根节点是id[id[id[…id[i]…]]],直到值不变,其实,每一个根节点都是自连接的,即id[i]=i。
例如:
节点: i 0 1 2 3 4 5 6 7 8 9
初始: id[i] 0 1 2 3 4 5 6 7 8 9
当前值:id[i] 0 1 9 4 9 6 6 7 8 9
例如,根据当前值可以看出,3的根节点是9,5的根节点是6
查找操作:就是检查p和q的根节点是否相同,因此,3,5是不连通的。
合并操作:为了合并p和q分别所在的集合,设置节点p的根节点的id值为q节点的根节点。
例如:
i 0 1 2 3 4 5 6 7 8 9
id[i] 0 1 9 4 9 6 6 7 8 6
快速合并的方法:查找可能最坏情况下需要O(N)操作
合并操作,只需要常数操作。
总的来说:执行M对N个节点的查找合并操作,需要O(MN)时间。
1.3 改进操作啊
在快速合并的基础上改进。因为快速合并仅仅是把一个节点的根设置为另一个节点的根。这样构成的树可能就比较高(极端情况是一个线性表的形式),因此,要设法减少树的高度,其实很简单,在合并的时候,把树的数目小的合并到数目大的上去就可以了。因此,需要增加一个数组sz来记录这个节点为根的树的大小。
查找操作:和快速合并一样。
合并操作:把小树合并到大树,更新sz数组相应的元素。
部分代码:
int i=root(p),j=root(q);
if(sz[i]<sz[j]) {id[i]=j;sz[j]+=sz[i]};
else {id[j]=I;sz[i]+=sz[j]};
改进的操作:查找操作O(lgN)时间可以;合并操作O(1);
总的来说:执行M对N个节点的查找合并操作,需要O(MlgN)时间。
还可以继续改进:路径压缩。在快速合并的基础上采用路径合并,即再查找p节点的过程中,把相应的路径上的节点的父节点设置为root(p)。一种简单的替换是仅仅把父节点设置为它的祖父节点就可以。
public int root(int i){
while(i!=id[i]){
id[i]=id[id[i]];
i=id[i];
}
return i;
}
改进2需要的操作:O(MlgN),实际过程中,是线性的,因为lgN是个常数。
1.4 应用
1)网络连通性的检查;
2)Kruskal’s的最小生成树算法。
分享到:
相关推荐
分治算法是计算机科学中的一个核心概念,它是一种解决问题的策略,通过将复杂问题分解为较小的、相同或相似的子问题来解决。这个过程通常涉及三个主要步骤:分解、解决和合并。分治法充分利用了问题的结构特性,使得...
4. **WeightedQuickUnion算法**:在并查集中,WeightedQuickUnion是一种优化的算法,它通过连接具有较少元素的集合到较多元素的集合来防止树形结构过于倾斜,从而提高查找效率。在实验中,这种算法被用来处理大规模...
在计算机科学领域,数据结构是组织和存储数据的方式,它对于高效算法的实现至关重要。B-树(B-tree)是一种自平衡的树数据结构,特别适用于大型数据库和文件系统,因为它能够保持数据有序,便于快速查找、插入和删除...
典型的分治算法有快速排序、归并排序和二分查找。 6. **动态规划**:通过构建状态转移方程,求解最优化问题。例如,斐波那契数列、背包问题、最短路径等。 7. **图论算法**:包括深度优先搜索(DFS)、广度优先...
8.分治算法:将大问题分解为小问题求解,然后合并结果,如快速排序、归并排序和Strassen矩阵乘法。 9.动态规划:解决多阶段决策问题,如斐波那契数列、最长公共子序列和旅行商问题。每个子问题的解都依赖于其前一...
4. **排序与查找算法**:快速排序、归并排序、冒泡排序、插入排序、选择排序、二分查找、哈希查找等。试题可能会要求你实现这些算法并分析其时间复杂度。 5. **动态规划**:解决最优化问题的一种有效方法,如背包...
- **二分查找** 在有序数组中快速定位元素,对于区间操作非常有用。 总结来说,本章节详细介绍了算法和数据结构的基本操作,并通过实例演示了如何运用这些工具解决实际问题。对于想要深入学习算法的初学者,这是一...
在计算机科学领域中, UNION 算法是一种常用的树合并算法,用于合并两个集合中的元素。在本文中,我们将深入探讨 UNION1 算法的实现细节,并对其进行详细的解释。 算法原理 UNION1 算法的核心思想是使用秩合并...
每个项按交易中出现的顺序插入,相同的项会被合并。 2. **挖掘频繁模式**:通过深度优先遍历FP树,生成条件模式树。每个节点代表一个频繁项,树的路径表示一个频繁项集。 3. **反向链接辅助**:利用反向链接快速查找...
- 讨论了查找算法(顺序查找、二分查找、哈希查找)及其效率比较。 8. **第8章:数据结构** - 系统地介绍了线性数据结构(数组、链表、栈、队列)和非线性数据结构(树、图)。 - 特别关注了树的遍历方法(前序...
字符串匹配(String Matching)算法如KMP、Boyer-Moore和Rabin-Karp等,是文本处理和搜索中的关键技术,它们在查找文本中的模式或关键字时发挥作用。 背包问题(Knapsack Problem)属于组合优化问题,常常出现在...
3. **排序与查找算法**: - **冒泡排序、插入排序、选择排序**:基础排序算法,虽然效率较低,但易于理解和实现。 - **快速排序、归并排序**:更高效的排序算法,快速排序是原地排序,归并排序则需要额外空间。 -...
- 典型分治算法:归并排序、快速排序、二分查找。 - 分治策略的适用条件及优缺点分析。 3. **lecture05.pdf - 动态规划** - 动态规划的概念:通过将原问题分解为子问题来求解。 - 最长公共子序列(LCS)问题:...
2. **节点操作**:定义函数来处理节点的分裂、合并、查找、插入和删除等操作。 3. **平衡策略**:当插入或删除导致节点过满或过空时,需要调整树的结构以保持平衡。 4. **遍历方法**:提供前序、中序和后序遍历的...
4. **查找算法**: - 线性查找:逐个检查元素直到找到目标值。 - 二分查找:适用于有序列表,每次将查找区间减半。 - 哈希查找:通过哈希函数快速定位目标值,理想情况下查找时间复杂度为O(1)。 5. **图算法**:...
* 二分查找法(Binary Search):一种高效的查找算法,通过将查找范围缩小到一个确定的范围实现查找。 * 暴力枚举(Brute Force):一种简单的查找算法,通过枚举所有可能的解决方案实现查找。 * 递归(Recursion)...
2. **查找算法**:查找算法用于在数据集中找到特定元素。基本的查找算法有线性查找,二分查找适用于有序数组,哈希表则提供了常数时间的查找效率。二分查找的效率高,但需先对数据进行排序,而哈希表则通过散列函数...
它的主要操作包括创建集合、合并集合以及查找元素所属的集合。 并查集的主要优点是它能高效地处理连接(union)和查询(find)操作,特别适用于解决“是否两个元素属于同一集合”这样的问题。在这个过程中,按秩...