本文主要是介绍纪念一下自己的Coursera Princeton Algorithm的课程第一个assignment,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天终于完成了第一个Union-Find的assignment,之前觉得特别的难,可是最后自己也搞定了。而且是100%满分。
自己后来plot了一下自己的分数,也许这就是学习曲线吧。刚开始不会,到后来中期显著提高,但是要到100%,那就要经历更多的波折,甚至是下降都有可能。最后才能达到100%满分。
我觉得最有用的还是下面这段源代码:
/******************************************************************************* Compilation: javac WeightedQuickUnionUF.java* Execution: java WeightedQuickUnionUF < input.txt* Dependencies: StdIn.java StdOut.java* Data files: https://algs4.cs.princeton.edu/15uf/tinyUF.txt* https://algs4.cs.princeton.edu/15uf/mediumUF.txt* https://algs4.cs.princeton.edu/15uf/largeUF.txt** Weighted quick-union (without path compression).*******************************************************************************/package edu.princeton.cs.algs4;/*** The {@code WeightedQuickUnionUF} class represents a <em>union–find data type</em>* (also known as the <em>disjoint-sets data type</em>).* It supports the <em>union</em> and <em>find</em> operations,* along with a <em>connected</em> operation for determining whether* two sites are in the same component and a <em>count</em> operation that* returns the total number of components.* <p>* The union–find data type models connectivity among a set of <em>n</em>* sites, named 0 through <em>n</em>–1.* The <em>is-connected-to</em> relation must be an * <em>equivalence relation</em>:* <ul>* <li> <em>Reflexive</em>: <em>p</em> is connected to <em>p</em>.* <li> <em>Symmetric</em>: If <em>p</em> is connected to <em>q</em>,* then <em>q</em> is connected to <em>p</em>.* <li> <em>Transitive</em>: If <em>p</em> is connected to <em>q</em>* and <em>q</em> is connected to <em>r</em>, then* <em>p</em> is connected to <em>r</em>.* </ul>* <p>* An equivalence relation partitions the sites into* <em>equivalence classes</em> (or <em>components</em>). In this case,* two sites are in the same component if and only if they are connected.* Both sites and components are identified with integers between 0 and* <em>n</em>–1. * Initially, there are <em>n</em> components, with each site in its* own component. The <em>component identifier</em> of a component* (also known as the <em>root</em>, <em>canonical element</em>, <em>leader</em>,* or <em>set representative</em>) is one of the sites in the component:* two sites have the same component identifier if and only if they are* in the same component.* <ul>* <li><em>union</em>(<em>p</em>, <em>q</em>) adds a* connection between the two sites <em>p</em> and <em>q</em>.* If <em>p</em> and <em>q</em> are in different components,* then it replaces* these two components with a new component that is the union of* the two.* <li><em>find</em>(<em>p</em>) returns the component* identifier of the component containing <em>p</em>.* <li><em>connected</em>(<em>p</em>, <em>q</em>)* returns true if both <em>p</em> and <em>q</em>* are in the same component, and false otherwise.* <li><em>count</em>() returns the number of components.* </ul>* <p>* The component identifier of a component can change* only when the component itself changes during a call to* <em>union</em>—it cannot change during a call* to <em>find</em>, <em>connected</em>, or <em>count</em>.* <p>* This implementation uses weighted quick union by size (without path compression).* Initializing a data structure with <em>n</em> sites takes linear time.* Afterwards, the <em>union</em>, <em>find</em>, and <em>connected</em>* operations take logarithmic time (in the worst case) and the* <em>count</em> operation takes constant time.* For alternate implementations of the same API, see* {@link UF}, {@link QuickFindUF}, and {@link QuickUnionUF}.** <p>* For additional documentation, see <a href="https://algs4.cs.princeton.edu/15uf">Section 1.5</a> of* <i>Algorithms, 4th Edition</i> by Robert Sedgewick and Kevin Wayne.** @author Robert Sedgewick* @author Kevin Wayne*/
public class WeightedQuickUnionUF {private int[] parent; // parent[i] = parent of iprivate int[] size; // size[i] = number of sites in subtree rooted at iprivate int count; // number of components/*** Initializes an empty union–find data structure with {@code n} sites* {@code 0} through {@code n-1}. Each site is initially in its own * component.** @param n the number of sites* @throws IllegalArgumentException if {@code n < 0}*/public WeightedQuickUnionUF(int n) {count = n;parent = new int[n];size = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;size[i] = 1;}}/*** Returns the number of components.** @return the number of components (between {@code 1} and {@code n})*/public int count() {return count;}/*** Returns the component identifier for the component containing site {@code p}.** @param p the integer representing one object* @return the component identifier for the component containing site {@code p}* @throws IllegalArgumentException unless {@code 0 <= p < n}*/public int find(int p) {validate(p);while (p != parent[p])p = parent[p];return p;}// validate that p is a valid indexprivate void validate(int p) {int n = parent.length;if (p < 0 || p >= n) {throw new IllegalArgumentException("index " + p + " is not between 0 and " + (n-1)); }}/*** Returns true if the the two sites are in the same component.** @param p the integer representing one site* @param q the integer representing the other site* @return {@code true} if the two sites {@code p} and {@code q} are in the same component;* {@code false} otherwise* @throws IllegalArgumentException unless* both {@code 0 <= p < n} and {@code 0 <= q < n}*/public boolean connected(int p, int q) {return find(p) == find(q);}/*** Merges the component containing site {@code p} with the * the component containing site {@code q}.** @param p the integer representing one site* @param q the integer representing the other site* @throws IllegalArgumentException unless* both {@code 0 <= p < n} and {@code 0 <= q < n}*/public void union(int p, int q) {int rootP = find(p);int rootQ = find(q);if (rootP == rootQ) return;// make smaller root point to larger oneif (size[rootP] < size[rootQ]) {parent[rootP] = rootQ;size[rootQ] += size[rootP];}else {parent[rootQ] = rootP;size[rootP] += size[rootQ];}count--;}/*** Reads in a sequence of pairs of integers (between 0 and n-1) from standard input, * where each integer represents some object;* if the sites are in different components, merge the two components* and print the pair to standard output.** @param args the command-line arguments*/public static void main(String[] args) {int n = StdIn.readInt();WeightedQuickUnionUF uf = new WeightedQuickUnionUF(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");}}/******************************************************************************* Copyright 2002-2018, Robert Sedgewick and Kevin Wayne.** This file is part of algs4.jar, which accompanies the textbook** Algorithms, 4th edition by Robert Sedgewick and Kevin Wayne,* Addison-Wesley Professional, 2011, ISBN 0-321-57351-X.* http://algs4.cs.princeton.edu*** algs4.jar is free software: you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation, either version 3 of the License, or* (at your option) any later version.** algs4.jar is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with algs4.jar. If not, see http://www.gnu.org/licenses.******************************************************************************/
这篇关于纪念一下自己的Coursera Princeton Algorithm的课程第一个assignment的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!