Java中的Kevin Bacon路径导致堆栈溢出?

Java中的Kevin Bacon路径导致堆栈溢出?,java,stack-overflow,shortest-path,Java,Stack Overflow,Shortest Path,我对Java非常陌生,我的代码中有一个问题,我想找到从演员到电影到演员到电影再到Kevin Bacon的最短路径。这存储在列表中,该列表将显示“演员a、电影a、演员B、电影B、凯文·培根”。我认为做这件事最好的方法是递归地做。但是,我得到了一个堆栈溢出错误 我将演员和电影存储在HashMap中。演员和电影都是键——如果演员被调用,它将返回演员所演电影的哈希集,如果电影被调用,它将返回演员的哈希集。findCostars方法查找给定参与者与之共谋的所有参与者 这是我的密码。任何帮助都将不胜感激 p

我对Java非常陌生,我的代码中有一个问题,我想找到从演员到电影到演员到电影再到Kevin Bacon的最短路径。这存储在
列表中,该列表将显示
“演员a、电影a、演员B、电影B、凯文·培根”
。我认为做这件事最好的方法是递归地做
。但是,我得到了一个
堆栈溢出错误

我将演员和电影存储在
HashMap
中。演员和电影都是
——如果演员被调用,它将返回演员所演电影的
哈希集
,如果电影被调用,它将返回演员的
哈希集
findCostars
方法查找给定参与者与之共谋的所有参与者

这是我的密码。任何帮助都将不胜感激

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;
}
public List findBaconPath(字符串参与者)抛出IllegalArgumentException{
ArrayList actors=新的ArrayList();
添加(actor);
ArrayList路径=辅助对象(参与者,参与者);
返回路径;
}
公共ArrayList帮助程序(ArrayList curr,String actor){
ArrayList=新建ArrayList();
HashSet movies=myMovies.get(actor);
ArrayList主演=(ArrayList)FindStars(演员);
Iterator it=movies.Iterator();
while(it.hasNext()){
String next=it.next();
HashSet movAct=myMovies.get(下一步);
如果(movAct.contains(“培根,凯文”)){
添加(“培根,凯文”);
列表。添加(下一步);
添加(参与者);
退货清单;
}否则{
迭代器itAct=coStars.Iterator();
while(itAct.hasNext()){
当前添加(下一步);
字符串nextActorValue=itAct.next();
当前添加(下一个TACTOR值);
助手(curr、nextActorValue);
}
}
}
返回null;
}

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


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

上再次迭代,因为您的搜索是深度优先的,并且您不排除已经访问过的图形节点,所以会出现堆栈溢出


因为您可能需要最短的路径,请尝试实施。

Hmm谢谢!我该如何为我已经拜访过的演员打分?因为我只有一个存储字符串和哈希集的哈希映射,所以有没有一种方法可以标记已经访问过的节点?因为标记是特定于算法的临时数据,所以您不希望将持久的电影/演员信息与它混在一起。您可以在搜索期间创建访问节点的临时哈希集。您想要最短路径还是最小化RottNotomates评分总和的路径?如果是后者,你可能需要小心涉及震颤后遗症的净负循环。