深度优先搜索

Posted

技术标签:

【中文标题】深度优先搜索【英文标题】:Depth-first search 【发布时间】:2013-10-07 08:41:00 【问题描述】:

我有一棵后缀树,这棵树的每个节点都是一个结构体

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;


【问题讨论】:

为什么要使用地图,您希望每个节点都使用地图,所以只需制作一个 vector 指针向量。无论哪种方式,您都会有很多冗余。 我认为对叶子的检查是错误的。如果一个节点没有子节点,即next 是一个空映射,它就是一个叶子节点。不知道上面sn-p里面sz是什么,但是好像不正确。 【参考方案1】:

您可以将map&lt;int, vector&lt;string&gt;&gt; 与您的深度优先搜索一起传递。当一个递归调用从某个节点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);
    

【讨论】:

我可以看到有一些问题,每次都足够了 如果我们想改变 suffices,我们是否需要 ref 而不是 val:map&lt;int, vector&lt;string&gt;&gt; &amp; suffices @doctorlove 是的,绝对的。我试图把它写下来 C++ish(带有引用),但我卡住了,所以我决定尽可能简单地写它......但事实上,地图 必须 被传递参考,否则这将不起作用。 @Heuster 我让它全球化

以上是关于深度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先搜索算法解释下?

简述深度优先搜索遍历的方法。

Python算法-深度优先搜索&广度优先搜索(DFS&BFS)

图的广度、深度优先搜索和拓扑排序

算法题——深度优先搜索与广度优先搜索