zoukankan      html  css  js  c++  java
  • 普林斯顿算法课Part2第一周作业_WordNet

    作业地址:http://coursera.cs.princeton.edu/algs4/assignments/wordnet.html

    作业难点:

    1、作业为第二部分的第一次作业,主要是熟悉程序代码书写,关键是设计数据结构;

    2、数据结构设计:

      ①我们需要设计一个list,用来存放synsets的第二部分,同时为了保持索引id,使用ArrayList比较好;

      ②构建synsets集,为高效存取这里使用HashMap;

      ③存取hypernyms集,为高效存取这里也使用HashMap;

      ④构建WordGraph,即WordNet的有向图;

    3、如何判断WordGraph是否有根:

      通过一个HashSet集ids,在构建synsets时增加id,在构建hpyernyms时移除id,然后id为空时,说明图有根。

    4、如何判断两点的祖先:

      通过两次BreadthFirstDirectedPaths遍历,记录两点的广度优先搜索路径,然后逐个遍历WordGraph的顶点,寻找最短路径祖先;

    5、如何求得两点的距离:

      求两点到祖先的距离之和即可。

    容易扣分点:

    部分代码:

    1、WordNet数据结构及构造函数:

        private  ArrayList<String> wordList;
        private  HashMap<String, Bag<Integer>> idMap;
        private  HashSet<Integer> ids;
        private  Digraph G;
        private  SAP sap;
        // constructor takes the name of the two input files
        public WordNet(String synsets, String hypernyms) {
            ids = new HashSet<Integer>();
            wordList = new ArrayList<String>();
            idMap = new HashMap<String, Bag<Integer>>();
            readSynsets(synsets);
            // build digraph
            G = new Digraph(wordList.size());
            buildWordDigraph(G, buildHynMap(hypernyms));
            // check is rooted DAG
            isRootedDAG();
            // create sap instance
            sap = new SAP(G);
        }
    View Code

    2、SAP数据结构及求祖先函数:

        private final Digraph G;
        private BreadthFirstDirectedPaths bfsPrior, bfsNext;
            
        // a common ancestor of v and w that participates in a shortest
        // ancestral bfs; -1 if no such bfs
        public int ancestor(int u, int w) {
            checkInput(u, w);
            int result = -1;
            int shortestLength = Integer.MAX_VALUE;
            bfsPrior = new BreadthFirstDirectedPaths(G, u);
            bfsNext = new BreadthFirstDirectedPaths(G, w);
            for (int i = 0; i < G.V(); i++) {
                if (bfsPrior.hasPathTo(i) && bfsNext.hasPathTo(i)) {
                    int dist = bfsPrior.distTo(i) + bfsNext.distTo(i);
                    if (dist < shortestLength) {
                        shortestLength = dist;
                        result = i;
                    }
                }
            }
            return result;
        }
    View Code
  • 相关阅读:
    LeetCode对撞指针汇总
    167. Two Sum II
    215. Kth Largest Element in an Array
    2018Action Recognition from Skeleton Data via Analogical Generalization over Qualitative Representations
    题解 Educational Codeforces Round 84 (Rated for Div. 2) (CF1327)
    题解 JZPKIL
    题解 八省联考2018 / 九省联考2018
    题解 六省联考2017
    题解 Codeforces Round #621 (Div. 1 + Div. 2) (CF1307)
    题解Codeforces Round #620 (Div. 2)
  • 原文地址:https://www.cnblogs.com/notTao/p/6357331.html
Copyright © 2011-2022 走看看