id数组的变化情况:

0 1 2 3 4 5 6 7 8 9
10 components
9 0
0 1 2 3 4 5 6 7 8 0
9 components
3 4
0 1 2 4 5 6 7 8 0
8 components
5 8
0 1 2 4 4 6 7 8 0
7 components
7 2
0 1 2 4 4 8 6 8 0
6 components
2 1
0 1 4 4 8 6 8 0
5 components
5 7
0 1 1 4 4 6 1 0
4 components
0 3
1 1 4 4 1 6 1 1
3 components
4 2
1 1 1 6 1 1
2 components

操作次数分析:

find()函数每次调用访问数组1次。

connected函数每次调用两次find()函数,故访问数组2次。

union函数访问数组的次数为:2 + N + (1,N-1)。其中2为两次调用find()函数,N为N次数组判断,(1,N-1)为可能的数组替换次数。

    public static void main(String[] args) {

        //initialize N components
int N = StdIn.readInt();
UFQuickFind uf = new UFQuickFind(N);
StdOut.println(uf); while(!StdIn.isEmpty()) { int p = StdIn.readInt();
int q = StdIn.readInt(); if(uf.connected(p, q)) {//ignore if connected
StdOut.println(p + " " + q + " is connected");
continue;
} uf.union(p, q);//connect p and q
StdOut.println(p + " " + q);
StdOut.println(uf);
}

对于这个client,对每个数据对,都调用一次connected函数和union函数。

下边对数组访问次数进行分析:

9 0:2 +   2 + 10 + 1

3 4:2 +   2 + 10 + 1

5 8:2 +   2 + 10 + 1

7 2:2 +   2 + 10 + 1

2 1:2 +   2 + 10 + 2

5 7:2 +   2 + 10 + 2

0 3:2 +   2 + 10 + 2

4 2:2 +   2 + 10 + 4

源代码:

package com.qiusongde;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut; public class UFQuickFind { private int[] id;//access to component id (site indexed)
private int count;//number of components public UFQuickFind(int n) {
//initialize count and id
count = n; id = new int[n];
for(int i = 0; i < n; i++) {
id[i] = i;
} } public int count() {
return count;
} public boolean connected(int p, int q) {
return find(p) == find(q);
} public int find(int p) {
return id[p];
} public void union(int p, int q) { int pID = find(p);
int qID = find(q); //do nothing if p and q are already
//in the same component
if(pID == qID)
return; //rename p's component to q's name
for(int i = 0; i < id.length; i++) {
if(id[i] == pID)
id[i] = qID;
}
count--; } @Override
public String toString() {
String s = ""; for(int i = 0; i < id.length; i++) {
s += id[i] + " ";
}
s += "\n" + count + " components"; return s;
} public static void main(String[] args) { //initialize N components
int N = StdIn.readInt();
UFQuickFind uf = new UFQuickFind(N);
StdOut.println(uf); while(!StdIn.isEmpty()) { int p = StdIn.readInt();
int q = StdIn.readInt(); if(uf.connected(p, q)) {//ignore if connected
StdOut.println(p + " " + q + " is connected");
continue;
} uf.union(p, q);//connect p and q
StdOut.println(p + " " + q);
StdOut.println(uf);
} } }

最新文章

  1. Bootstrap&lt;基础二十&gt; 标签
  2. mongoDB研究笔记:分片集群部署
  3. Android 编程下的自定义 xmlns
  4. HTML中id、name、class 区别
  5. Java数据结构之线性表(2)
  6. ios - cordova 简介
  7. hdu4323Magic Number(dp)
  8. JNI_最简单的Java调用C/C++代码
  9. java教程
  10. (中等) CF 585B Phillip and Trains,BFS。
  11. Spring测试框架JUnit4.4 还蛮详细的
  12. asp.net core系列 33 EF查询数据 (2)
  13. .Net Core应用框架Util介绍(五)
  14. (转)你真的会写单例模式吗——Java实现
  15. SCRUM 12.23
  16. SML + NL + HJ
  17. redis常用命令(二)
  18. 001_docker-compose构建elk环境
  19. MYSQL三种安装方式--二进制包安装
  20. nmcli 使用记录---fatt

热门文章

  1. 使用wifi连接eclipse进行android程序调试
  2. HTML5 2D平台游戏开发#9蓄力技
  3. nginx的proxy_pass到$host的问题
  4. Frogger - poj 2253 (Dijkstra)
  5. 【ubantu】在ubantu下如何对svn进行操作命令
  6. 在Ubuntu下利用Eclipse调试FFmpeg
  7. saltstack之文件管理
  8. Intellij idea 切换SVN路径
  9. 如何通过js处理相同时间的信息整合到一起的问题
  10. Linux中的关机