簡體   English   中英

如何在C ++中跟蹤BFS深度

[英]How to keep track of BFS depth in C++

我想在2D數組上執行BFS,並且每個單元格都可以表示為pair<int,int> 我使用queue<pair<int,int>>來跟蹤每個級別的單元格,但是我找不到跟蹤深度的聰明方法。 (我不想定義另一個結構來記錄每個級別的深度)

如何跟蹤廣度優先搜索的深度? 這是Java中的解決方案。 每個級別以null ,一旦看到null ,我們便增加深度。

我想知道C ++中是否有類似的優雅解決方案。 現在,我可以想到以下幾種方式:

1)計算每個級別的單元格數目( push() ),並在每個pop()之后減少計數。 一旦count == 0 ,請增加深度。

2)使用兩個queue並在每個級別的末尾用新queue替換舊queue 在每次迭代結束時增加深度。

3)也許在隊列中存儲pair<int,int>的指針,並使用NULL來分隔級別?

從本質上講,與在隊列中插入null相似的解決方案是僅插入不可能作為單元格出現的哨兵值。 例如pair<numeric_limits<int>::max(), 0>

(1)可以工作,但設置count = queue.size()並在每次彈出時將其遞減會更好/更容易。 當它變為0時,增加深度並再次設置count = queue.size()。

(2)工作正常。 使用std :: swap切換隊列。 這是我通常執行的操作,因為我喜歡外部for(int depth=0; !newnodes.empty(); ++depth)您也可以使用向量而不是實際隊列,因為您不會在同一對象。 第二級循環只是向量的迭代。

(3)有效,但是很浪費。 其他種類的標記值也可以使用,但我認為上述(1)在所有情況下都比這更好。

在您更喜歡使用std :: deque而不是兩個向量的情況下,我喜歡這樣寫:

queue.push_back(root);
for (int depth=0; !queue.empty(); ++depth)
{
    for (size_t remaining=queue.size(); remaining>0; --remaining)
    {
        auto item = queue.pop_front();
        //.... queue.push_back(...), etc.
    }
}

...這與上面的我的(1)非常相似,但是我得到了不錯的深度循環,並通過在remaining上編寫循環條件,我們可以避免將任何其他內部循環檢查都queue.empty()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM