我聽過一些意見,二叉搜索樹中的迭代查找比遞歸方式更有效,是這樣嗎?
(我知道在空間方面,迴避更昂貴)遍歷二叉樹迭代或遞歸 - 複雜性分析
回答
就時間複雜性而言(大O),如果您的算法正確實施,應該沒有任何區別。每次遞歸調用在堆棧上分配新空間時,遞歸通常會在空間上較重。我正在談論你的特定二叉搜索樹結構,但通常這也是正確的。
遞歸搜索和迭代搜索之間確實沒有區別,因爲無論如何遍歷樹的高度檢查左節點或右節點而不是兩者(並且這適用於迭代和遞歸),因此你總是遍歷樹的高度。
理論上沒有變化。對於平衡BST,bigO將是O(n)和O(logn)。 遞歸遍歷在紙上看起來很乾淨。但是它有很多開銷。當一個函數被遞歸地調用時,調用函數的狀態必須被存儲在堆棧中,並且控制被傳遞給被調用的函數。但是當你迭代地做時,你不會有這樣的開銷。所以出於實際的目的,你應該使用迭代方法。
如果您編寫遞歸代碼,並且如果事實證明是尾遞歸,大多數現代編譯器都會嘗試通過將其轉換爲迭代代碼來優化它。
@arnumoezhi:那是你說話的開銷,是與程序的運行或只是內存問題的表現掛鉤 – JavaSa
@ peter.petrov:想聽聽你的意見以及 – JavaSa
@JavaSa:兩者。在最壞的情況下,你的堆棧空間是O(n),你只需使用遞歸調用即可獲得性能 – arunmoezhi
很大程度上取決於您的語言實施!如果程序調用在您的語言中是昂貴的,那麼手寫迭代可能會更快。如果過程調用總是推棧,那麼手寫迭代可以節省內存。在像Scheme,Haskell,ML等函數式語言中(我認爲也是基於基於棧的語言,如Postscript或FORTH),您通常可以期望在樹查找操作中找到的「尾遞歸」轉換爲迭代在引擎蓋下,所以沒有區別。事實上,這種特殊形式的尾遞歸(函數返回本身的值)很可能會被甚至不支持完全尾部優化(TCO)的編譯器優化。
- 1. 遞歸遍歷二叉樹
- 2. 構建二叉搜索樹從預遍歷迭代(不遞歸)
- 3. 遞歸遍歷二叉查找樹
- 4. 遞歸函數來遍歷二叉樹
- 5. 迭代八叉樹遍歷
- 6. 遞歸二叉樹遍歷代碼去無窮
- 7. 二叉樹遍歷的遞歸VS非遞歸
- 8. 遍歷二叉樹
- 9. Morris遍歷與二叉樹遞歸有序的性能
- 10. 二叉搜索樹中的遍歷複雜度(使用迭代器)?
- 11. 二叉樹遍歷
- 12. 二叉樹遍歷
- 13. 遍歷二叉樹
- 14. 二叉樹O(n)的InOrder樹遍歷的時間複雜度?
- 15. 無遞歸的二叉樹遍歷的直觀解釋
- 16. Javascript:遍歷二叉樹?
- 17. 樹遍歷遞歸
- 18. 樹遍歷遞歸計算
- 19. Python:二叉樹遍歷迭代器不使用條件
- 20. 遞歸 - 二叉樹
- 21. 遞歸二叉樹
- 22. 遞歸二叉樹
- 23. 二叉樹級別遍歷
- 24. 二叉樹遍歷抽象
- 25. 二叉搜索樹遍歷
- 26. 遍歷二叉搜索樹
- 27. 爲了遍歷二叉樹
- 28. 二叉搜索樹遍歷
- 29. 遍歷非二叉樹
- 30. 遍歷二叉搜索樹
這隻有在語言實現沒有實現TCO時纔是正確的。事實上,完全的TCO幾乎肯定是不需要的;對於自我尾巴呼叫的較少侵入性優化,我相信即使在C中也可以廣泛使用,這對於這種應用來說應該是足夠的。 – dfeuer
@ peter.petrov嘿!你能否給我一個二叉樹遞歸遍歷的確切公式。也許有一些鏈接。我GOOGLE了,但無法找到它。其實我想找到我的算法是二叉樹遍歷+其他邏輯的複雜性。我對其他邏輯有複雜性,但對於樹部分我知道的是O(n)。 –