《算法》——动态连通性

西南某高校准大二某five,立志暑假拿下《算法》的一半!

由于懒得看这本书前面对JAVA的介绍,我直接跳到第一章最后学起了动态连通性算法。讲真,确实有被震撼到。

之前我对树和森林的认知都停留在链表和数组构建成的二叉树上。而quick_union算法则让我看到了数组自身实现森林的可能性——利用数组的索引和内存中的值组成类似链表的东西(咦怎么好像在高中数学里见过)。

int find(int p){
   
        while (p != id[p])
            p = id[p];
        return p;
}

这段代码就是quick_union算法中数组构建的树的查找。跟原先的quick_find算法相比,find算法真的不够快——最坏情况下查找到数据需要的时间为N(quick_find的代码贴在下面了)。

int quick_find(int p) {
    return id[p]; }

但是动态连通性算法解决的主要问题是添加连通关系的操作(即union())太慢。在quick_find算法中,我们可以看到,它的union()在最坏情况下所需时间为N的平方,此时函数内部进行了N+2次数组访问,且使用了N-1次union()函数,所需时间为(N+2)(N-1)~N的平方。这个速度确实有些慢。

void quick_find_union(<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值