博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
普林斯顿大学公开课 算法1-10:并检查集合-高速整合方法优化
阅读量:5806 次
发布时间:2019-06-18

本文共 1241 字,大约阅读时间需要 4 分钟。

本节介绍了高速综合优化算法。

重量的概念,每次操作的时候将重量小的部件挂在重量大的部件之下。

这样就避免了树形结构太高的问题。

下图展示了优化前后的树形结构深度的对照。

证明

能够证明每一个节点的深度最大为lgN。

  1. 由于每次合并的时候较小的部件要放在较大的部件之下,所以假设要添加树的高度。每次合并之后,树的大小至少要翻一番。

  2. 而N个节点最多仅仅能翻lgN番。

复杂度

这样的算法中合并操作最坏的复杂度为lgN,查询操作最坏情况的复杂度为lgN。

路径压缩

尽管眼下的算法已经可以保证复杂度在lgN下面。可是还有更好的方法。

基本想法就是在查找根节点时,将路径上的全部节点进行路径压缩。仅仅须要一行额外的代码。

使用路径压缩之后查询操作的复杂度是lg*N。lg*是第二种函数,表示的是lgN几次才干达到1。比方lg*16,须要三次lg,lg16=4,lg4=2,lg2=1,所以lg*16=3。

理论上来说查询操作的复杂度不是1,可是实际应用中,这样的算法的复杂度就是1。

结论

尽管现代的超级计算机速度非常快,可是好的算法能节省很多其它的时间。第一种高速查找算法解决一个问题须要30年时间,而如今有了更好的算法。解决相同的问题仅仅须要6秒。

所以,不要期望以后计算机速度快了算法就不须要了。算法是计算机的基础。它永远不会过时。

代码

public 
class 
UnionFind {
    
private 
int
[] id;
    
private 
int
[] size;
 
    
public 
UnionFind(
int 
n) {
        
id = 
new 
int
[n];
        
size = 
new 
int
[n];
        
for
(
int 
i = 
0
; i < n; i++) {
            
id[i] = i;
            
size[i] = 
1
;
        
}
    
}
 
    
public 
void 
union(
int 
a, 
int 
b) {
        
int 
root_a = root(a);
        
int 
root_b = root(b);
 
        
if
(root_a == root_b) {
            
return
;
        
}
 
        
// 为了保持树的平衡
        
if
(size[root_a] < size[root_b]) {
            
id[root_a] = id[root_b];
            
size[root_b] += size[root_a];
        
else 
{
            
id[root_b] = id[root_a];
            
size[root_a] += size[root_b];
        
}
    
}
 
    
public 
boolean 
connected(
int 
a, 
int 
b) {
        
return 
root(a) == root(b);
    
}
 
    
public 
int 
root(
int 
x) {
        
while
(x != id[x]) {
            
id[x] = id[id[x]]; 
// 路径压缩
            
x = id[x];
        
}
        
return 
x;
    
}
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
H2内存数据库 支持存储到文件
查看>>
css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题
查看>>
BlockCanary 一个轻量的,非侵入式的性能监控组件(阿里)
查看>>
【HDU 1228】A + B
查看>>
CentOS 7搭建SVN服务器
查看>>
Floyd最短路算法
查看>>
Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为?
查看>>
CentOS 6.6 FTP install
查看>>
C#------判断btye[]是否为空
查看>>
图解Ajax工作原理
查看>>
oracle导入导出小记
查看>>
聊一聊log4j2配置文件log4j2.xml
查看>>
NeHe OpenGL教程 第七课:光照和键盘
查看>>
修改上一篇文章的node.js代码,支持默认页及支持中文
查看>>
Php实现版本比较接口
查看>>
删除设备和驱动器中软件图标
查看>>
第四章 TCP粘包/拆包问题的解决之道---4.1---
查看>>
html语言
查看>>
从源码看集合ArrayList
查看>>
spring-boot支持websocket
查看>>