[英]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.