Coursera Algorithms week1 练习测验

Social network connectivity

package unionFind;

import java.io.*;
import java.util.*;
//增加一个count表示群体的个数 判断当为1时全部连接
import edu.princeton.cs.algs4.StdOut;

public class SocialNetworkUF {
	private QuickUnionUF uf;
	public SocialNetworkUF(int num) {
		uf = new QuickUnionUF(num);
	}
	public String getEarliestConTime(FileInputStream ins) {
		try {
			Scanner scanner = new Scanner(ins,"utf-8");
			String earliestConTime = null;
			while(scanner.hasNextLine()) {
				String line = scanner.nextLine();
				if(line != null && !line.trim().equals("")) {
					String[] lineArray = line.split(" ");
					if(lineArray.length == 3) {
						String timestamp = lineArray[0];
						int p = Integer.parseInt(lineArray[1]);
						int q = Integer.parseInt(lineArray[2]);
						if(!uf.connected(p, q)) {
							uf.union(p, q);
						}
						if(uf.count() == 1) {
							earliestConTime = timestamp;
							return earliestConTime;
						}
					}
					
				}
			}
			
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		return "不存在这样的时间";
		
	}
	public static void main(String[] args) {
		 
		try {
			FileInputStream ins = new FileInputStream("socialNetworkLog.txt");
			SocialNetworkUF socialNet = new SocialNetworkUF(10);
			String earliestConTime = socialNet.getEarliestConTime(ins);
			StdOut.println("the earliest connectet time is :" + earliestConTime);
		} catch (FileNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
		
	}
}


Union-find with specific canonical element.

//维护一个最大值的数组
package unionFind;

import edu.princeton.cs.algs4.StdOut;

public class UFWithFindLargest {
	//每个节点的父节点
	private int[] id;
	private int[] sz;
	private int[] large;
		
	public UFWithFindLargest(int N){
			
		sz = new int[N];
		id = new int[N];
		large = new int[N];
		for(int i = 0; i < id.length; i++) {
			id[i] = i;
			sz[i] = 1;
			large[i] = i;
		}
	}
	private int root(int i) {
		while(id[i] != i) {
			id[i] = id[id[i]];
			i = id[i];
		}
		return i;
	}
	public int findLargest(int i) {
		return large[root(i)];
	}
	public boolean connected(int p, int q) {
		return (root(p) == root(q));
	}
	public void union(int p ,int q) {
		int proot = root(p);
		int qroot = root(q);
		if(proot == qroot) {
			return;
		}
		if(sz[proot] < sz[qroot]) {
			id[proot] = qroot;
			sz[qroot] += sz[proot];
			if(large[proot] > large[qroot]) {
				large[qroot] = large[proot];
			}
		}else {
			id[qroot] = proot;
			sz[proot] += sz[qroot];
			if(large[qroot] > large[proot]) {
				large[proot] = large[qroot];
			}
		}
	}	
	public static void main(String[] args) {
		UFWithFindLargest uf= new UFWithFindLargest(10);
		uf.union(0, 2);
		uf.union(2, 7);
		StdOut.println(uf.findLargest(0) == 7);
	}
}

Successor with delete

//把删去的数union起来,利用第二题的FindLargest,加上1进行判断即可
package unionFind;

import edu.princeton.cs.algs4.StdOut;

public class SuccessorWithDelete {
	private boolean data[];
	private UFWithFindLargest uf;
	private int N;
	
	public SuccessorWithDelete(int N) {
		this.N = N;
		data = new boolean[N];
		for(int i = 0; i < N; i++) {
			data[i] = true;
		}
		uf = new UFWithFindLargest(N);
	}
	public void remove(int x) {
		data[x] = false;
		if(x > 0 && !data[x-1]) {
			uf.union(x, x - 1);
		}
		if(x < N - 1 && !data[x+1]) {
			uf.union(x, x+1);
		}
	}
	public int successor(int x) {
		if(data[x])
			return x;
		 else{
			int res = uf.findLargest(x) + 1;
			if(res >= N) {
				StdOut.print("不存在这样的数");
				return -1;
			}else {
				return res;
			}
		 }
		
	}
	public static void main(String[] args) {
		SuccessorWithDelete test = new SuccessorWithDelete(10);
		test.remove(2);
		StdOut.println(test.successor(2) == 3);
		StdOut.println(test.successor(3) == 3);
	}
}

猜你喜欢

转载自blog.csdn.net/u013453787/article/details/83379928