簡體   English   中英

遍歷二叉樹迭代或遞歸-復雜度分析

[英]Traversing binary tree iterative or recursive - complexity analysis

我已經聽到一些意見,認為二叉搜索樹中的迭代查找比遞歸方法更有效,這是真的嗎?
(我知道從太空角度來看,修復費用更高)

就時間復雜度(Big O)而言,如果算法正確實現,應該沒有任何區別。 由於每個遞歸調用都會在堆棧上分配新的空間,因此遞歸通常相對於空間而言更為沉重。 我說的是您的特定二進制搜索樹結構,但是通常情況下也是如此。

遞歸搜索和迭代搜索之間確實沒有區別,因為無論如何,遍歷樹的高度檢查枯萎的左節點或右節點,但絕不會兩者都使用(並且這對於迭代和遞歸都適用),因此您始終遍歷樹的高度。

理論上沒有改變。 對於不平衡,bigO將為O(n),對於平衡BST,bigO將為O(logn)。 遞歸遍歷在紙上看起來很干凈。 但是它有很多開銷。 遞歸調用函數時,必須將調用函數的狀態存儲在堆棧中,並將控件傳遞給被調用函數。 但是,當您反復進行操作時,就沒有這樣的開銷。 因此,出於實際目的,您應該使用迭代方法。

如果您編寫了一個遞歸代碼,並且證明它是尾遞歸,則大多數現代編譯器都會嘗試通過將其轉換為迭代代碼來對其進行優化。

在很大程度上取決於您的語言實現! 如果過程調用在您的語言中很昂貴,那么手寫迭代可能會更快。 如果過程調用始終推棧,則手寫迭代可能會節省內存。 在諸如Scheme,Haskell,ML等功能語言中(我也認為在諸如Postscript或FORTH之類的基於堆棧的語言中),通常可以期望在樹查找操作中發現的“尾遞歸”將轉換為迭代在引擎蓋下,所以沒有區別。 實際上,這種特殊形式的尾部遞歸(函數將對自身的調用的值返回)可以甚至由甚至不支持完整尾部調用優化(TCO)的編譯器進行優化。

暫無
暫無

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

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