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
  • 相关阅读:
    maven问题
    用例图中三种关系详解(转)
    UML系列图--用例图
    Visio画UML用例图没有include关系的解决方法
    Linux中环境变量文件及配置
    如何开启ubuntu的SSH服务(不要和openssl搞混淆了)
    linux下的gedit命令使用方法与技巧
    ubuntu安装mysql5.7
    通过 HTTP 头进行 SQL 注入
    Redis各种数据结构内存占用测试
  • 原文地址:https://www.cnblogs.com/notTao/p/6357331.html
Copyright © 2011-2022 走看看