前言:
有本算法书叫:Algorithms 4th Edition.pdf
,它是用java实现的,但是算法的内核是一样,不在乎于语言,考虑到java当今的…, 咱们尝试用golang学习算法.
问题:
思考🤔:你会如何实现它?。。。。。下面看看the big bang theory
男主leonard
母校名校普林斯顿大学
是如何解决的。
第一版:使用一个数组保存每个节点,如果两个节点的值一样,那么就是联通着的:
品3秒,再继续:
等会?看上图,如果 0 5 两个节点已经连通了,它们的值都是 5,那么当后续5 6 两个节点联通时,最好是把节点6的值修改成和节点5一样,这样只需要修改一次值,但是这种理想的情况又需要额外的判断处理。
但是如果把节点5的值修改成和节点6一样,那么节点0也得跟着和节点5一样做处理,如果出现特殊的情况,假设0-8 共九个节点都是联通着的,它们的值都是8, 当把节点8和节点9 再去联通时,需要遍历0-8这九个节点,然后把它们的值都修改成节点9的值:即9.
其实修改值操作还好,赋个值罢了,问题在于,需要遍历整个数组去判断已经联通着的那批节点,找出它们,再修改值。所以是线性N操作。。。性能问题突出,如果节点数量大,那。。。
我们先假设节点数量不多,看看代码如何实现:
package main
import "fmt"
var id []int
func main() {
var n = 10
quickFindUF(n)
}
/*
*
第一个版本
*/
func quickFindUF(n int) {
id = make([]int, n)
for i := 0; i < n; i++ {
id[i] = i
}
union(0, 5)
union(5, 6)
union(1, 2)
union(2, 7)
union(3, 4)
union(3, 8)
union(4, 9)
// true
fmt.Println(connected(0, 6))