Algorithm 硬编码深度优先搜索结果(或优化?)

Algorithm 硬编码深度优先搜索结果(或优化?),algorithm,search,enums,depth-first-search,hardcode,Algorithm,Search,Enums,Depth First Search,Hardcode,我需要获得树的所有可能路径,因此我实现了如下DFS: void bisearch(std::vector<int> path, int steps, int node, std::vector<std::vector<int>> *paths) { int sum = 0; if (path.size() == steps) { for(std::vector<int>::ite

我需要获得树的所有可能路径,因此我实现了如下DFS:

void bisearch(std::vector<int> path, int steps,
                           int node, std::vector<std::vector<int>> *paths) {
  int sum = 0;
  if (path.size() == steps) {
    for(std::vector<int>::iterator it=path.begin(); it != path.end(); ++it) {
        sum += (*it);   
    }
    if (sum == node)
        paths->push_back(path);
  }
  else {
    std::vector<int> uPath(path);
    uPath.push_back(1);
    bisearch(uPath, steps, node, paths);
    std::vector<int> dPath(path);
    dPath.push_back(0);
    bisearch(dPath, steps, node, paths);
  }
}
void双搜索(标准::向量路径,整数步,
int节点,std::vector*路径){
整数和=0;
if(path.size()=步数){
对于(std::vector::iterator it=path.begin();it!=path.end();++it){
总和+=(*it);
}
if(sum==节点)
路径->推回(路径);
}
否则{
std::向量上行路径(path);
向上推回(1);
双搜索(上行路径、步骤、节点、路径);
std::向量dPath(路径);
dPath.push_back(0);
双搜索(dPath、步骤、节点、路径);
}
}
上面的代码为我提供了长度为“steps”的树的某个结束节点的所有路径。然后,我循环遍历所有结束节点,并运行它以获得每个路径。问题是它需要永远!我在考虑可能对所有可能的组合进行硬编码以加快速度,当然我不能手动完成,因为例如,一棵有25个步骤的树可能有2^25~=3500万个可能的组合,但也许我可以打印搜索的输出并使用它进行硬编码?或者有人看到我可以做的任何简单的优化会对性能产生很大的影响吗?谢谢

编辑:让我澄清一下。我需要路径,即沿树的移动顺序,其中1表示右手移动,0表示左手移动(或向上/向下,以您喜欢的为准)。例如,一个两步树,我需要四个有序对(1,0)(0,1)(1,1)(0,0)。

因为“所有的组合”应该只意味着“在某个水平上向右/向左旋转的组合”,你可以循环0到2^n-1,前面用0填充的二进制表示可能正是你想要的


如果您想要的是左转计数等于某个数字k的路径计数,那么这正好等于从0到2^n-1的数字,其中k位等于1,你可以用它来计算你想要的结果。

好吧,你关于0到2^n-1的循环回答是有道理的,但是你怎么知道一个给定的数字需要填充多少个0呢?因为所有的数字都需要n个二进制位,只需填充到长度为n为止,注意你必须在二进制数的前面填充0,不是结尾。啊,谢谢,我会写下来,让它转一转,看看它是否有助于提高性能。你也可以使用a,这样你就不必想办法填充你的位字符串表示了。位集基本上只是一个压缩向量,有望降低内存分配成本并提高缓存性能。