使用队列的非递归回溯:内存不足

时间:2017-01-05 13:44:12

标签: c++ c++11 queue out-of-memory backtracking

我尝试使用C ++ 11方言中的backtracking容器来实现std::queue示例程序。

然而,算法中某处存在编码错误导致程序内存不足。这是什么错误?

在下面的代码示例中,可以假设函数reject()accept()first_child()next_child()可以正常工作,因为它们已经使用递归和std::stack容器implementations of backtracking

// helper functions
bool reject(const std::string &c);
bool accept(const std::string &c);
const std::string * first_child(const std::string &c);  // nullptr == no child
const std::string * next_child(const std::string &c);   // nullptr == no child

void backtrack_que(const std::string &start)
try
{
    std::queue<std::string> que;

    que.push(start);

    while (!que.empty())
    {
        if (reject(que.front()))
        {
            que.pop();
            continue;
        }

        if (accept(que.front()))
            std::cout << que.front() << '\n';

        const std::string *p_child(first_child(que.front()));

        que.pop();

        if (p_child != nullptr)
        {
            que.push(*p_child);

            const std::string *p_sibling(next_child(que.back()));

            while (p_sibling != nullptr)
            {
                que.push(*p_sibling);
                p_sibling = next_child(que.back());
            }
        }
    }
}
catch (...)
{
    std::cerr << "unknown exception in `" << __func__ << '`' << std::endl;
    throw;
}

1 个答案:

答案 0 :(得分:0)

我进行了一次简单的计数测试,发现@IgorTandetnik对于队列变体是准确的:它达到了超过6000万的最大尺寸。

令我惊讶的是, Stack 变体并没有超过200.在重新访问代码时我得出结论,这是由于 Stack 变体&#34的原因;蒲草&#34;在继续下一代之前,队列变体累积了大量孩子时,可以使用可能的孩子:在更多的计算机技术术语中, Stack Depth-First Search队列确实Breadth-First Search

同样令人惊讶的是,显然传统的递归变体似乎是最有效的,也是最快的。

max recursion depth for bt-rec: 6
max container size for bt-stk:  176
max container size for bt-que:  60466176