目录
注意:只在几年前上过一学期java基础过程,基本相当于不懂,这次学algorithm都用Java写的,所以试着两者一起学,对Java的很多描述可能都不专业
Dynamic Connectivity
视频中出现了一段代码
public static void main(String[] args) {
int n = StdIn.readInt();
UF uf = new UF(n);
while (!StdIn.isEmpty()) {
int p = StdIn.readInt();
int q = StdIn.readInt();
if (uf.connected(p, q)) continue;
uf.union(p, q);
StdOut.println(p + " " + q);
}
StdOut.println(uf.count() + " components");
}
本想照着敲上,但是过程中发现 StdIn不知道是什么类,于是去booksite找了源代码过来
StdIn和StdOut都是algorithm写的类库,与UF.java文件放在同一个package就行,图片中的函数式UF类中的主函数,其他的看代码学习就懂了
- UF.java:
http://algs4.cs.princeton.edu/15uf/UF.java.html
- StdIn.java:
https://github.com/kevin-wayne/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/StdIn.java
- StdOut.java:
https://github.com/kevin-wayne/algs4/blob/master/src/main/java/edu/princeton/cs/algs4/StdOut.java
疑问:
rank[] 表示什么?
->Quick-Union Improvements
Quick Find
快速查找,数组中直接存放联通节点,查找很快,但是合并时与该节点相关的节点也需要改变,因此合并效率太低。
Quick Union
快速合并,数组中存放根节点,合并时只需改变跟几点即可,但是容易形成瘦高的树,这样在查找时效率较低
Quick-Union Improvements
1.为节点添加rank[]属性,记录该根节点有多少子节点,在合并操作时将节点多的根节点作为新的根节点,这样可以有效的减少树的深度
2.
public int find (int p) {
validate(p);
while (p != parent[p]) {
parent[p] = parent[parent[p]];
p = parent[p];
}
return p;
}
parent[p] = parent[parent[p]];
这一行代码在进行查找操作时顺便将树展开,即将叶子节点的parent[]直接对应为根节点,减少树的深度