数据结构——动态联通性

动态联通基础类class UF{ constructor(n){ this.count=n; this.id=[]; for(let i=0;i<n;i++){ this.id[i]=i; } } count(){ return this.count; ...
摘要由CSDN通过智能技术生成
动态联通

基础类

class UF{
    constructor(n){
        this.count=n;
        this.id=[];
        for(let i=0;i<n;i++){
            this.id[i]=i;
        }
    }
    count(){
        return this.count;
    }
    connected(p,q){
        return this.find(p)==this.find(q);
    }
}
UF.prototype.find=find;
UF.prototype.union=union;
quick-find

当且仅当id[p]==id[q]时,p与q为联通的。即若p与q已经存在于一个联通分量,则不需采用一个其他方法。若不是,则将id[p]和id[q]的所有联通分量的变成相同的联通分量。
时间复杂度,find,union:o(N)

function find(p){
    return this.id[p];
}
function union(p,q){
    if(this.connected(p,q)){
        return;
    }else{
        let index;
        var temp=this.id[q];
        while((index=this.id.indexOf(temp,index+1))>=0){
            this.id[index]=this.id[p];
            this.count--;
        }
        return;
    }
}

时间复杂度为:O(n^2)

quick-union

定义:每一个触点对应的id[]元素都是同一个分量中,另一个触点的名称。
时间复杂度:union树高,find 树高
最坏情况为平方级

/*quick-union*/
function find(p){
    //求根节点
    while(p != this.id[p]){
        p=this.id[p];
    }
    return p;
}
function union(p,q){
    let pRoot=this.find(p);
    let qRoot=this.find(q);
    if(pRoot==qRoot){
        return;
    }else{
        this.id[qRoot]=pRoot;;
    }
    this.count--;
}
加权quick-union算法

改进:将小树连接到大树上,降低算法复杂度(算法4按树的大小连接,本文按树的高度进行连接)
union复杂度lgN,find复杂度 lgN

class UF{
    constructor(n){
        this.count=n;
        this.id=[];
        this.size=[];
        for(let i=0;i<n;i++){
            this.id[i]=i;
            this.size[i]=1;
        }
    }
    count(){
        return this.count;
    }
    connected(p,q){
        return this.find(p)==this.find(q);
    }
}
UF.prototype.find=find;
UF.prototype.union=union;
function find(p){//寻找根节点
    //求根节点
    while(p != this.id[p]){
        p=this.id[p];
    }
    return p;
}
function union(p,q){
    let pRoot=this.find(p);
    let qRoot=this.find(q);
    if(pRoot==qRoot){
        return;
    }else{

        if(this.size[pRoot]==this.size[qRoot]){
            this.size[pRoot]++;
            this.id[qRoot]=pRoot;
        }else if(this.size[pRoot]>this.size[qRoot]){
            this.id[qRoot]=pRoot;
        }else{
            this.id[qRoot]=pRoot;
        }
    }
    this.count--;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源包含了几乎所有的数据结构的动画视频,帮助我们更好的理解数据结构与算法的编程思路。 目录如下: 'B树的删除.swf', 'B树的生长过程.swf', '三元组表的转置.swf', '中序线索化二叉树.swf', '串的顺序存储.swf', '二分查找.swf', '二叉排序树的删除.swf', '二叉排序树的生成.swf', '二叉树的建立.swf', '克鲁斯卡尔算法构造最小生成树.swf', '冒泡排序.swf', '分块查找.swf', '单链表结点的删除.swf', '单链表结点的插入.swf', '图的深度优先遍历.swf', '基数排序.swf', '堆排序.swf', '头插法建单链表.swf', '寻找中序线索化二叉树指定结点的前驱.swf', '寻找中序线索化二叉树指定结点的后继.swf', '尾插法建表.swf', '希儿排序.swf', '开放定址法建立散列表.swf', '归并排序.swf', '循环队列操作演示.swf', '快速排序.swf', '拉链法创建散列表.swf', '拓扑排序.swf', '最短路径.swf', '朴素串匹配算法过程示意.swf', '构造哈夫曼树的算法模拟.swf', '构造哈夫曼树过程.swf', '栈与递归.swf', '树、森林和二叉树的转换.swf', '桶式排序法.swf', '直接插入排序.swf', '直接选择排序.swf', '邻接表表示的图的广度优先遍历.swf', '邻接表表示的图的深度优先遍历.swf', '顺序查找.swf', '顺序栈(4个存储空间).swf', '顺序栈(8个存储空间).swf', '顺序表的删除运算.swf', '顺序表的插入.swf', '顺序队列操作.swf'。 (注:.swf动画格式可直接使用播放器打开。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值