簡體   English   中英

為什么要添加不平衡二叉搜索樹O(n)?

[英]Why is add in unbalanced Binary Search Tree O(n)?

這是BST Add中Binary Search Tree中add的實現

private IntTreeNode add(IntTreeNode root, int value) {
        if (root == null) {
            root = new IntTreeNode(value);
        } else if (value <= root.data) {
            root.left = add(root.left, value);
        } else {
            root.right = add(root.right, value);
        }

        return root;
    }

我知道為什么它在O(log n)中運行。 這就是我的分析方式。 我們的樹大小為n。 多少個2的切口或半切口將把這棵樹縮小到1的大小。因此,我們有n(1/2)^ x = 1的表達式,其中1/2表示每個半切口。 為x解決這個問題,我們有log2(x),所以logn來自搜索。
這是Heap的演講幻燈片,討論了不平衡二進制搜索的運行時。 在此處輸入圖片說明

我的問題是,即使二進制搜索樹不平衡,使用相同的策略來分析添加的運行時間也行不通嗎? 您必須進行多少次切割。 運行時是否仍為O(log n),而不是O(n)? 如果是這樣,有人可以說明為什么它是O(n)的數學方法嗎?

對於不平衡的樹:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          ...

您每次操作將樹切成兩半的直覺不再適用。 該不平衡樹是不平衡二進制搜索樹的最壞情況。 要在列表底部搜索10 ,必須執行10操作,每個操作針對樹中的每個元素。 這就是為什么不平衡的二進制搜索樹的搜索操作為O (n)的原因-該不平衡的二進制搜索樹等效於鏈接列表。 每個操作都不會砍掉一半的樹-只是您已經訪問過的一個節點。

這就是為什么二進制搜索樹(例如紅黑樹和AVL樹)的特殊版本很重要的原因:它們維護的樹要平衡得足夠好,以便所有操作(搜索,插入,刪除)仍為O (log n)。

BST的O(n)情況發生在頂部有最小值或最大值時,實際上將BST變成了鏈表。 假設您添加的元素為: 1, 2, 3, 4, 5生成您的BST,由於每個元素只有一個right child ,所以它將成為一個鏈表。 加法6必須在每個節點上向下遍歷所有元素,因此使加法O(n)的漸近復雜度

暫無
暫無

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

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