每日一题-6.8

刷leetcode 990. 等式方程的可满足性

  • 最开始我的思路比较麻烦,刷题还是少。
    我想着把所有的字符读出来以后都把他们当作一个个节点,将等式和不等式分开使用,然后根据等式关系可以建立无向图的邻接矩阵。将有不等式关系的符号在图中用遍历方法来求两个节点是否连通。这样的算法是正确的,但是有点太过于繁复了。这里的比较好的解题思路是并查集算法(union-find),我之前在算法第四版里面看到过,但是忘掉了,今天这道题让我又拿出书看了一遍。这个并查集的算法可以很容易的解决连通图的问题,对数据进行分组,和判断两个节点是否属于同一类别
    union-find 算法 中关键是三个函数和一个数组
index[];//数组用来记录节点的标记,可以看作树的父节点构造形式,
//每个节点的标记都指向他的父节点,根节点指向自己
connect(p,q);//判断两个节点是否连通
find(p);//找到p所在的连通图类别
union(p,q);//如果p,q属于一个连通图则不用操作,如果不是则将两个连通图链接到一起

union-find 三种常见实现方法

1.quick-find

  • 这第一种就比较暴力,在合并时候将某一个连通域的标记全部改成另一个连通域的标记。但是在find的时候只要一步就可以到位。但是每一次uinon都要遍历所有的节点,比较麻烦。

2.quick-union

  • 这个方法折中一下,让find不是很方便,甚至在某些情况下需要很多步,其思想就是将属于一个连通域的所有节点都构造成一颗树的形式,其实第一种方法也是一棵树,只是高度只有2而已。但是在这个方法中,find的操作是一直向父节点链接查找直到根,根节点编号就是这个连通域的标记。union的操作是对两个合并节点进行find,如果他们的find返回值不同,则将其中一个连通域的根链接到另一个连通域的根上。这样的话,union操作就比遍历所有节点要快很多。但是这个方法的缺点就是,假如树变成一条单链一样的话就几近是遍历了,甚至find也得遍历,这就很难受。

3.加权的quick-union

  • 最后的这个办法是很好的,quick-union其实想想是不错的,就是有特殊情况太糟糕了,但是我们只要避免这个特殊情况就可以让他的效果很好。我们要控制树的高度,find操作的复杂度与树高联系在一起。在合并时可以让小树总是链到大树的根上,而不是大树链接到小树上,这样就可以很大程度控制树高的增长速度,只是需要记录连通域树的节点数,需要增加一些变量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值