【问题标题】:Hard Coding Depth First Search Results (or Optimizing?)硬编码深度优先搜索结果(或优化?)
【发布时间】:2013-04-25 12:41:30
【问题描述】:

我需要获取树的所有可能路径,所以我实现了这样的 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)。

【问题讨论】:

    标签: algorithm search enums depth-first-search hardcode


    【解决方案1】:

    由于“所有组合”应该只是“在某个级别右转/左转的组合”,您可以循环通过 0 到 2 ^ n - 1,前面填充 0 的二进制表示可能做你想要的。

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

    【讨论】:

    • 好的,你循环 0 到 2^n-1 的答案是有道理的,但是你怎么知道给定数字要填充多少个 0?
    • 由于所有数字都需要有 n 个二进制位,因此只需填充直到长度为 n,注意您必须在二进制数的前面填充 0,而不是末尾。
    • 啊,明白了,非常感谢,我会写下来试一试,看看它是否有助于提高性能。
    • 您也可以使用bitset,这样就无需弄清楚如何填充您的位串表示。 bitset 基本上只是一个压缩向量,有望降低内存分配成本并提高缓存性能。
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多