一些灵巧的求并算法

 1 class DisjSets
 2 {
 3 public:
 4     explicit DisjSets(int numElements);
 5     int find(int x)const;
 6     int find(int x);
 7     void unionSets(int root1, int root2);
 8 private:
 9     vector<int> s;
10 };
11
12
13 DisjSets::DisjSets(int numElements) : s(numElements)
14 {
15     for (int i = 0; i < s.size(); i++)
16         s[i] = -1;
17 }
18
19 //下面是将两个集合并
20 void DisjSets::unionSets(int root1, int root2)
21 {
22     s[root2] = root1;
23 }
24
25 //下面是寻找一个元素所在的集合
26 int DisjSets::find(int x) const
27 {
28     if (s[x] < 0)
29         return x;
30     else
31         return find(s[x]);
32 }
 1 //下面的是并集的一个变种,用于控制树的高度以及节点数量
 2 void DisjSets::unionSets(int root1, int root2)
 3 {
 4     if (s[root2] < s[root1])    //root2 is deeper
 5         s[root1] = root2;
 6     else
 7     {
 8         if (s[root1] == s[root2])
 9             s[root1]--;            //如果深度相同的话,再是root1的深度变得更深一点
10         s[root2] = root1;        //然后再让root2指向root1
11     }
12 }
1 //对上述并集程序使用了路径压缩之后,体现在find程序上的变化
2 int DisjSets::find(int x)const
3 {
4     if (s[x] < 0)
5         return x;
6     else
7         return s[x] = find(s[x]);
8 }
时间: 2024-12-08 18:46:13

一些灵巧的求并算法的相关文章

递归学习(一)最简单的C语言递归求年龄算法

递归是我们在学习编程中,必须要去学习的,虽然递归晦涩难懂 ,但是很多时候,递归的思想会很有用,但是在实际开发中,不建议使用递归,要用循环来代替递归,不然bug无穷. ----------------------------------------------------------- 问题描述: 有5个人坐在一起, 问第5个人,他说比第4个人大2岁, 问第4个人,他说比第3个人大2岁, 问第3个人,他说比第2个人大2岁, 问第2个人,他说比第1个人大2岁, 问最后一个人,他说10岁 第5个人多大

求幂算法

1.简单递归 最简单的求幂算法是根据xn=x*xn-1,使用递归: def foo(x,n): if n==0: return 1 else: return x*foo(x,n-1) 这样求x的n次方,会进行n-1次乘法运算,n较大时效率很低. 2.高效递归 一种更高效的算法,可以将运算次数降到LogN的级别,由于: xn=xn/2*xn/2 , n为偶数时 xn=x(n-1)/2*x(n-1)/2*x , n为奇数时 def foo(x,n): if n==0: return 1 else:

算法手记(2)Dijkstra双栈算术表达式求值算法

这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了了解这个过程,我们可以自行搭建一套简易的算术表达式处理机制,这里就用到栈特性和本篇提到的Dijkstra算法. 概述:     算术表达式可能是一个数.或者是由一个左括号.一个算术表达式.一个运算符.另一个算术表达式和一个右括号组成的表达式.为了简化问题,这里定义的是未省略括号的算术表达式,它明确地

RSA简介(四)——求逆算法

此处所谓求逆运算,是指在模乘群里求逆. 第一节里提到互质的两个定义: (1)p,q两整数互质指p,q的最大公约数为1. (2)p.q两整数互质指存在整数a,b,使得ap+bq=1. 只要明白了欧几里得算法,很容易就可以求出两整数的最大公约数,而这是一个小学时候就学习到的算法.这个算法有个可能让我们更熟悉的名字,叫辗转相除法. 我经常搞不清楚被除数和除数,不知道会不会有人和我一样.所以我要先在这里写明一下,防止混淆,一个除法,除号前的叫被除数,除号后的脚除数. 单次除法,X=m*Y+n,X为被除数

表达式求值算法、rpn、1470、1475、1477、1479

以下为表达式求值系列完整算法,借用C++语言,读者不妨对照下图表达式求值算法实例,仔细推敲. 1 /* 2 DATA:2015 1 30 3 From:13420228 4 */ 5 //测试数据: 6 // 4 7 // (0!+1)*2^(3!+4) - (5! - 67 - (8+9)) 8 // (1+2)*3+4*5 9 // 1.000 + 2 / 4 10 // ((1+2)*5+1)/(4^2)*3 11 #include <iostream> 12 #include <

进一步完善之后的一元N次方程求导算法

祝大家节日快乐.......写代码就是过节.... package com.system.Tools; /** * 这个类,实现对函数的求导算法 * 最大目标  实现对任意多元函数的偏导数和全导数的求导算法 * 最小目标  实现对一元N次函数的求导算法 *  * @author Administrator */public class SystemMathTools { /* *  还不是很完善,需要进一步修改...     *      *  by comsci 2019.2.4 经过进一步的

求平方根算法 Heron’s algorithm

求平方根问题 概述:本文介绍一个古老但是高效的求平方根的算法及其python实现,分析它为什么可以快速求解,并说明它为何就是牛顿迭代法的特例. 问题:求一个正实数的平方根. 给定正实数 \(m\),如何求其平方根\(\sqrt{m}\)? 你可能记住了一些完全平方数的平方根,比如\(4, 9, 16, 144, 256\)等.那其它数字(比如\(105.6\))的平方根怎么求呢? 实际上,正实数的平方根有很多算法可以求.这里介绍一个最早可能是巴比伦人发现的算法,叫做Heron's algorit

非递归快速求幂算法

快速求正整数次幂,当然不能直接死乘.举个例子:3 ^ 999 = 3 * 3 * 3 * … * 3直接乘要做998次乘法.但事实上可以这样做,先求出2^k次幂:3 ^ 2 = 3 * 33 ^ 4 = (3 ^ 2) * (3 ^ 2)3 ^ 8 = (3 ^ 4) * (3 ^ 4)3 ^ 16 = (3 ^ 8) * (3 ^ 8)3 ^ 32 = (3 ^ 16) * (3 ^ 16)3 ^ 64 = (3 ^ 32) * (3 ^ 32)3 ^ 128 = (3 ^ 64) * (3

求立方根算法--个人对立方根算法的穷举和优化

在hpe实训中心学习,遇到了求立方根的题目,在此做一下算法笔记, 分析过程: 数n的立方根就是n=i*i**i;所以我们会优先想到一下方法. static double g32(double n){ //简易版 double i = 0, k = 0.0005f; if (n < 0) { //输入负数判断 k /= -1; } do{ i+=k; }while(abs(i*i*i)<abs(n)); //abs为自己写的求绝对值方法 return i; } 可以看出此方法的求解精度为0.00