【问题标题】:Find 'connected components' in graph在图中查找“连接的组件”
【发布时间】:2009-05-18 22:35:03
【问题描述】:

我正在使用HashMap <String,ArrayList<String>> 构建一个词库来保存单词及其同义词(此数据结构是必需的)。

为了分配的目的,同义关系被认为是可传递的。 (我们可以把词库想象成一个图表)。 我想要完成的是在一个文本文件中打印这个图,每行都有一个连接的组件。换句话说,所有可以合并为同义词的单词都应该放在一行中。

public void save() {
    try {
        FileWriter fw = new FileWriter(defaultDefinitionFile);
        BufferedWriter out = new BufferedWriter(fw);
        Set<String> keys = thesaurus.keySet();
        Iterator<String> ite = keys.iterator();
        while (ite.hasNext()) {
            String key = ite.next();
            out.write(key);
            ArrayList<String> synonyms = thesaurus.get(key);
            Iterator<String> i = synonyms.iterator();
            while (i.hasNext()) {
                String syn = i.next();
                out.write(","+syn);
                keys.remove(syn);
            }
            out.write("\r\n");
        }
        out.close();
        fw.close();
    }
    catch (Exception e) {
        System.out.println("Error writing to file");
        e.printStackTrace();
    }
}

这就是我想象中发生的方式:

打印一个单词及其每个同义词,然后从数据结构中删除这些同义词,这样我们就不会有重复的行。

问题当然是我在迭代哈希图的内容时无法删除任何内容。

我缺少任何替代方法吗?

附:我一直保留“图表”的隐喻只是因为我需要标题雄辩而简洁。我知道这个比喻的用处有限。

【问题讨论】:

  • 这个问题适合 map reduce(目前找不到很好的参考)

标签: java hashmap graph-traversal


【解决方案1】:

您可以将打印的单词存储在Set 中,然后只处理尚未在集合中的单词。

旁白:尽管确实可以将其视为图形问题,但您的代码并未将其视为这样。如果我们将其视为一个图问题,那么我们就不会假设每个单词的所有同义词都列在相应的ArrayList 中,因此需要计算对称和传递闭包。只有这样我们才能提取等价类。

(实际上,同义词关系不是传递的,我知道。)

【讨论】:

  • 我理解其中的区别。没错,词库模型只表示一种图,其中每个连通分量都是一个完整的图。
【解决方案2】:

我不认为这个(你的一般想法)会起作用,因为“同义性”不是传递属性。

有很多词的同义词本身不是同义词。

【讨论】:

  • 作为家庭作业,这是要求的一部分,以使事情更简单。
【解决方案3】:

不要删除该项目,而是将其添加到要忽略的项目列表中。

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 2014-04-25
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多