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

时间:2013-05-01 13:56:05

标签: 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>::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);
  }
}

上面的代码为我提供了长度为“steps”的树的某些结束节点的所有路径。然后我循环遍历所有结束节点并运行它以获取每个路径。问题是需要永远!我想可能硬编码所有可能的组合以加快速度,当然我不能手工完成这个,因为例如一个25步的树将有2 ^ 25~ = 3500万种可能的组合,但也许我可以打印搜索的输出和使用硬编码?或者有人看到我能做出的任何简单的优化会对性能产生重大影响吗?感谢。

编辑:让我澄清一下。我需要路径,即沿着树的移动顺序,其中1代表右手移动,0代表左手(或者你喜欢的上/下)。所以例如一个2步树,我需要四个有序对(1,0)(0,1)(1,1)(0,0)。

1 个答案:

答案 0 :(得分:1)

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

如果你想要的是左转数等于某个数k的路径数,那么这只等于0到2 ^ n - 1的数字,k比特等于1,你可以使用这可以计算出你想要的结果。