[英]Time complexity of construction of a binary tree from inorder and preorder traversals
給定這是從inorder和preorder遍歷構造樹的代碼。 我無法弄清楚他們是如何達到O(n ^ 2)時間復雜度的。 有任何想法嗎? 我看到在順序序列中搜索索引將是O(n),其余的如何計算?
O(N^2)
復雜度是由於對於Preorder遍歷中的每個項目(其中有N
),您必須在Inorder遍歷中搜索其分區(同樣還有N
個)。
粗略地說,您可以將此算法視為將節點放置在網格上,其中Inorder遍歷提供x坐標,Preorder遍歷提供y坐標:
以他們給出的示例為例,進行以下遍歷(Inorder then Preorder):
Inorder: DBEAFC
Preorder: ABDECF
現在這是他們正在使用的網格:
D B E A F C
A + + + A | |
| +--------------+ |
B|F + B | F |
+---------+ -----+
DE|C D E C
現在,算法需要知道網格中放置每個節點的位置,只需將節點放在網格中x和y坐標相同的位置即可。
在這種情況下,看起來網格的大小實際上是NlogN
,這將導致遍歷網格的NlogN
復雜性(因此算法的NlogN
時間復雜度), 但是這棵樹是平衡的 。 在最壞的情況下,您的樹實際上可能是一個鏈表。
例如,考慮這個樹,其中preorder和inorder遍歷是相同的:
Inorder: DBEAFC
Preorder: DBEAFC
D B E A F C
D D | | | | |
-----+ | | | |
B B | | | |
-----+ | | |
E E | | |
-----+ | |
A A | |
-----+ |
F F |
-----+
C C
這是最糟糕的情況,你看,網格中有N*N
位置需要檢查。 因此在最壞的情況下,存在N*N
時間復雜度。
你正在遍歷遞歸內的整個preorder
數組,並在每個堆棧幀中搜索inorder
遍歷數組中的數字。 所以O(N*N) = o(N^2)
。
你是絕對正確的,因為在inorder數組中搜索將花費O(n)時間
在最壞的情況下,T(n)= T(n-1)+ O(n)
解決這個問題我們得到T(n)= O(n²)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.