簡體   English   中英

二階搜索樹中的有序遍歷復雜性(使用迭代器)?

[英]In-order traversal complexity in a binary search tree (using iterators)?

相關問題: 二叉樹O(N)的InOrder樹遍歷的時間復雜度? 但是它基於遍歷遞歸(因此在O(log N)空間中),而迭代器只允許消耗O(1)空間。

在C ++中,通常需要將標准容器的迭代器遞增為O(1)操作。 對於大多數容器來說,它已被輕易證明,但是使用map等,似乎有點困難。

  • 如果將map實現為跳過列表,那么結果將是顯而易見的
  • 然而,它們通常被實現為紅黑樹(或至少作為二叉搜索樹)

因此,在有序遍歷期間,有時候“下一個”值不容易達到。 例如,如果您指向左子樹的右下方葉子,則要遍歷的下一個節點是根,這是depth步長。

我試過“證明”算法的復雜性(就“步驟”而言)是攤銷的 O(1),這似乎沒問題。 但是我還沒有進行演示。

這是我為深度為4的樹追蹤的一個小圖,數字(在節點的位置)表示在有序遍歷期間從該節點到下一個節點的步數:

       3
   2       2
 1   1   1   1
1 2 1 3 1 2 1 4

注意:如果這是一棵較大樹的子樹,則最右邊的葉子的成本為4。

總和為28,總節點數為15:因此平均每個節點的成本小於2,(如果它保持不變)將是一個很好的攤銷成本。 所以:

  • 在有序遍歷期間,為平衡(和完整)二叉搜索樹增加迭代器真的是O(1)嗎?
  • 可以將結果擴展到覆蓋非完整二叉搜索樹嗎?

是的,對於任何樹,攤銷成本實際上是每次迭代的O(1)

證明基於您“訪問”每個節點的次數。
葉子只訪問過一次。 沒有葉子最多訪問3次:

  1. 從父節點到節點本身。
  2. 當從左子樹回來時
  3. 當從正確的子樹回來時

沒有更多的訪問任何節點,因此如果我們總結每個節點的訪問次數,我們得到一個小於3n ,所以所有節點的總訪問次數是O(n) ,這給了我們每步O(1)攤銷。

(注意,因為在一個完整的樹中有n / 2個葉子,我們得到你遇到的2n ,我相信可以證明任何樹的訪問總和將小於2n ,但是這個“優化”不在范圍在這里IMO)。


每步的最壞情況是O(h) ,它是平衡樹中的O(logn) ,但在某些情況下可能是O(n)


PS我不知道如何在C ++中實現Red-Black樹,但如果您的樹數據結構包含來自每個節點的parent字段,它可以替換遞歸堆棧並允許O(1)空間消耗。 (這當然是“作弊”,因為存儲n這樣的字段是O(n)本身)。

暫無
暫無

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

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