【问题标题】:Which data structure to store co-authorship?存储共同作者的数据结构是什么?
【发布时间】:2011-10-31 10:22:57
【问题描述】:

我有一个作者名单,上面有书名和出版年份,例如:

Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes、Doug Lea:Java 并发实践,2006 年

Ken Arnold、James Gosling 和 David Holmes:Java 编程语言,2005 年

...

我想知道哪种数据结构最适合存储关于合著者、他们共同撰写的书籍和出版年份的信息。

我想稍后使用这些信息来绘制图表(在JUNG 中,我使用的是 java),其中每个作者都是节点,边缘是他们共同创作的每本书。每年都会绘制单独的图表。我正在考虑使用多图:

Map<Year, Map<Author, List<Map<Co-author, Title>>>>

但也许这过于复杂了?

提前感谢您的帮助。

【问题讨论】:

    标签: java data-structures graph jung


    【解决方案1】:

    如何将一组作者和标题放在一个对象中,例如命名为“书”?这样,您的数据结构可以很简单

    class Book {
        List<Author> authors;
        Title title;
    }
    
    Map<Year, Set<Book>> booksInYears
    

    绘图算法可以这样工作:

    for (Book book : booksInYears.get(aYear)) 
        for (Author author1 : book.authors) 
            for (Author author2 : book.authors) 
                if (author1 != author2) 
                    drawEdge(author1, author2, book.title);
    

    drawEdge 方法将首先检查两个作者是否已经绘制了相应的节点(例如,使用包含已绘制节点的作者的集合,或者可能是作者 => 节点图)并绘制所需的节点,然后绘制边缘它们之间。

    【讨论】:

      【解决方案2】:

      只需从中创建一个 JUNG 图; JUNG 将处理数据结构。也就是说,节点将是作者,边将是共同作者关系(其中将包含有关作品的信息)。

      也就是说,在过去使用过合着图时,您可能希望将合着图更自然地表示为二分图(作者与作品)或超图。这样您就不需要多次重复地表示工作。

      【讨论】:

        【解决方案3】:

        我认为这样构造数据是个坏主意,为什么不使用多态性概念?

        为什么不创建 Class Book ,包含出版年份、名称等内容。 比创建另一个实体如Class Author,并且在两个Book之间构造会包含List&lt;Author&gt; coAuthors,而Author可以包含List&lt;Book&gt;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-09
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-15
          • 1970-01-01
          相关资源
          最近更新 更多