2013-10-07 230 views
1

我有一個後綴樹,這棵樹的每個節點是一個結構深度優先搜索

struct state { 
int len, link; 
map<char,int> next; }; 
state[100000] st; 

我需要爲每個節點DFS和得到,我可以接觸到所有的字符串,但我不知道如何製作。 這是我的DFS功能

void getNext(int node){ 
    for(map<char,int>::iterator it = st[node].next.begin();it != st[node].next.end();it++){ 
     getNext(it->second); 
} 
} 

這將是完美的,如果我能像

map<int,vector<string> > 

其中int是我的樹和矢量串的節點,我可以達到

現在它的工作原理

void createSuffices(int node){//, map<int, vector<string> > &suffices) { 
if (suffices[sz - 1].size() == 0 && (node == sz - 1)) { 
    // node is a leaf 
    // add a vector for this node containing just 
    // one element: the empty string 
    //suffices[node] = new vector<string> 
    //suffices.add(node, new vector<string>({""})); 
    vector<string> r; 
    r.push_back(string()); 
    suffices[node] = r; 
} else { 
    // node is not a leaf 
    // create the vector that will be built up 
    vector<string> v; 
    // loop over each child 
    for(map<char,int>::iterator it = st[node].next.begin();it != st[node].next.end();it++){ 
     createSuffices(it->second); 
     vector<string> t = suffices[it->second]; 
     for(int i = 0; i < t.size(); i ++){ 
      v.push_back(string(1,it->first) + t[i]); 
     } 
    } 
    suffices[node] = v; 
} 
} 
+0

爲什麼要使用地圖,你想這對每個節點所以只要矢量指針的載體。無論哪種方式,你都會有相當多的冗餘。 – Leeor

+0

我認爲檢查一片葉子是錯誤的。如果一個節點沒有子節點,那麼它就是一個葉子,也就是說,如果'next'是一個空映射。我不知道上面的代碼片段中有什麼'sz',但它看起來不正確。 –

回答

0

您可以通過map<int, vector<string>>來獲得她與你的深度第一次搜索。當遞歸調用從某個節點n返回時,您知道該節點的所有足夠的準備就緒。我的C++技能是太有限了,所以我會在僞代碼寫:

void createSuffices(int node, map<int, vector<string>> suffices) { 
    if (st[node].next.empty()) { 
     // node is a leaf 
     // add a vector for this node containing just 
     // one element: the empty string 
     suffices.add(node, new vector<string>({""})); 
    } else { 
     // node is not a leaf 
     // create the vector that will be built up 
     vector<string> v; 
     // loop over each child 
     foreach pair<char, int> p in st[node].next { 
      // handle the child 
      createSuffices(p.second, suffices); 

      // prepend the character to all suffices of the child 
      foreach string suffix in suffices(p.second) { 
       v.add(concatenate(p.first, suffix)); 
      }     
     } 
     // add the created vector to the suffix map 
     suffices.add(node, v); 
    } 
} 
+0

因爲我可以看到有一些問題,每次都有足夠的空間 –

+0

如果我們想要改變足夠的話,我們是否需要通過參考而不是val:map >並且足夠' – doctorlove

+0

@doctorlove是的,絕對。我試圖把它寫成C++ ish(帶有引用),但是我被卡住了,所以我決定把它寫得儘可能簡單......但的確,map *必須*通過引用傳遞,否則這會贏得'工作。 –