Java中的Kevin Bacon路径会给堆栈溢出吗?

时间:2012-11-25 19:26:37

标签: java stack-overflow shortest-path

我对Java很陌生,我的代码中存在问题,我想找到从 actor到电影到演员到电影到Kevin Bacon 的最短路径。这存储在list "Actor A, Movie A, Actor B, Movie B, Kevin Bacon"中。recursively我认为这样做的最好方法是StackOverflowError。但是,我得到HashMap<String, HashSet<String>>

我将演员电影存储在keys中。 actors movies 都是HashSet - 如果调用了 actor ,那么它将返回<{1}}的< em> movies actor 已经进入,如果 movie 被调用,它将返回 actor的HashSet 它有。 findCostars方法查找给定 actor 所有 actor

这是我的代码。任何帮助都会受到重视!

public List<String> findBaconPath (String actor) throws IllegalArgumentException {
    ArrayList<String> actors = new ArrayList<String>();
    actors.add(actor);
    ArrayList<String> path = helper(actors, actor);
    return path;
}

public ArrayList<String> helper(ArrayList<String> curr, String actor) {
    ArrayList<String> list = new ArrayList<String>();
    HashSet<String> movies = myMovies.get(actor);
    ArrayList<String> coStars = (ArrayList<String>) findCostars(actor);
    Iterator<String> it = movies.iterator();
    while (it.hasNext()) {
        String next = it.next();
        HashSet<String> movAct = myMovies.get(next);
        if (movAct.contains("Bacon, Kevin")) {
            list.add("Bacon, Kevin");
            list.add(next);
            list.add(actor);
            return list;
        } else {
            Iterator<String> itAct = coStars.iterator();
            while(itAct.hasNext()) {
                curr.add(next);
                String nextActorValue = itAct.next();
                curr.add(nextActorValue);
                helper(curr, nextActorValue);
            }
        }
    }
    return null;
}

2 个答案:

答案 0 :(得分:2)

您的堆栈溢出是因为您的搜索是深度优先的,并且您不会排除已经访问过的图形节点。

由于您可能想要最短路径,请尝试实施Breadth-first search

答案 1 :(得分:0)

您永远不会检查您是否两次不处理同一部电影。

第一次调用将开始处理movies,第一次迭代可能会为第一个actor和相同的电影调用相同的方法。然后第二次调用将开始在movies ....

上再次迭代