我正在查看@AndreyT對this問題的回覆,我對經典DFS與基於堆棧的DFS的內存效率有個疑問。爭論是傳統的回溯DFS不能通過簡單的堆棧到隊列替換從BFS創建。在通過堆棧到隊列替換來執行BFS到DFS時,會損失傳統DFS的空間效率。不是一個搜索算法專家(雖然我正在閱讀它),但我會認爲這只是「真實的」並隨之而來。經典(基於遞歸的)深度首先搜索比基於堆棧的DFS更高的內存效率?
但是,我的問題實際上是關於整體內存效率。雖然遞歸解決方案確實具有一定的代碼效率(我可以通過幾行遞歸搜索代碼做更多的事情)和優雅,但是它沒有內存(可能性能)「打」,因爲它是遞歸?
每當你遞歸到函數中時,它會將本地數據壓入堆棧,函數的返回地址以及編譯器認爲維護返回狀態所需的任何其他內容等。這可以快速加起來。它也必須爲每個遞歸做一個函數調用,它也吃掉了一些操作(也許很少......或者它可能會破壞分支的可預測性,從而迫使管道刷新......這裏不是專家......隨意幫腔)。
我想我現在想堅持簡單的遞歸,而不是像這個問題的答案那樣進入像尾遞歸這樣的「替代形式」。最起碼到現在。
請鏈接您提到的問題。但是一般來說,如果你的深度不小於顯式堆棧通常會更好。 – zch
@NonlinearIdeas遞歸或非遞歸將具有相似的空間複雜度,堆棧開銷在回溯情況下無關緊要,因爲與深度相比,大多數問題中遞歸樹的寬度非常高非常高 –
@NonlinearIdeas我建議遞歸回溯,因爲編碼和調試很容易。 –