2012-11-25 64 views
2

我很新的Java和我在我的代碼,在這裏我想找到凱文·貝肯從演員到電影演員爲影片的最短路徑有問題。這存儲在list中,其將變爲"Actor A, Movie A, Actor B, Movie B, Kevin Bacon"。我認爲這樣做的最好方法就是去做recursively。但是,我得到StackOverflowErrorJava中的Kevin Bacon路徑給出了堆棧溢出?

我存儲演員在HashMap<String, HashSet<String>>電影。無論演員電影keys - 如果演員被調用,則返回電影演員一直處於一個HashSet,如果電影被調用,它返回一個HashSet演員它有。該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; 
} 
+1

你想那爛番茄的收視率和最小的最短路徑或路徑?如果是後者,你可能需要小心周圍涉及* Tremors *續集的淨負循環。 –

回答

2

由於搜索是深度優先的,並且不排除已經訪問過的圖形節點,所以會出現堆棧溢出。

因爲你很可能要在最短的路徑,嘗試實施Breadth-first search

+0

嗯,謝謝!我如何去標記我已經訪問過的演員?因爲我擁有的是一個存儲字符串和哈希集的散列表,是一種標記已經訪問過的節點的方法嗎? – user202925

+1

具體到你的算法因爲標籤是暫時的數據,你不希望弄亂它持久的電影/演員信息。您可以在搜索期間創建訪問節點的臨時哈希集。 –

0

你從不檢查你不處理同一部電影兩次。

第一次調用,便開始處理movies,第一次迭代可能會調用相同的方法爲第一男主角和相同的電影。然後第二次調用將開始在movies上重新迭代...。