在Java中检测Hashmap中的循环依赖关系

时间:2014-11-17 10:51:31

标签: java algorithm graph dependencies cyclic

我有

的散列图
Tables => Set of Parent Tables [ HashMap<String, HashSet<String>> ]

非循环案例可以是:

A -> [B,C]
D -> [B,C]
B -> [C]
c -> []

循环案例的例子是:

A -> [B,C]
B -> [C]
C -> [A]

我想拒绝循环案例,因此需要一个能够检测提供的hashmap是否有任何循环的函数:

public boolean hasDependencies (  HashMap<String, HashSet<String>> objectAndItsDependentsMap )
{
   //Implementation
}

我已阅读帖子,建议用于检测周期的算法,但作为java的新手不能使用该知识来构成上述功能。请帮忙!

2 个答案:

答案 0 :(得分:1)

我建议您阅读并实施Tarjan的算法。

Tarjan's algorithm

前段时间我用过它。这非常有效。

另见:

Best algorithm for detecting cycles in a directed graph

答案 1 :(得分:-1)

这是一个仅基于您的示例的粗略实现。我建议对其他例子进行测试。

public boolean hasDependencies(Map<String, Set<String>> objectAndItsDependentsMap) {
    for (String node : objectAndItsDependentsMap.keySet()) {
        final Set<String> directNeighbors = objectAndItsDependentsMap.get(node);
        for (String directNeighbor : directNeighbors) {
            Set<String> next = objectAndItsDependentsMap.get(directNeighbor);
            while (next != null) {
                for (String n : next) {
                    next = objectAndItsDependentsMap.get(n);
                    if (next != null && (next.contains(n) || next.contains(node))) {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}