簡體   English   中英

二進制搜索樹與數組的有序元素

[英]Binary Search Tree vs Array for ordered elements

考慮以下情況:要插入數組中的數據始終按順序排列,即(1, 5, 12, 20, ...)/A[i] >= A[i-1](1000, 900, 20, 1, -2, ...)/A[i] <= A[i-1]

為了支持這樣的數據集,擁有二叉搜索樹或數組是否更有效。

(旁注:我只是想對類型為(K, T, V)的定時哈希圖運行一些幼稚的分析,並且時間總是井井有條。我正在使用Map<K, BST<T,V>>進行辯論vs Map<K, Array<T,V>> 。)

據我了解,以下費用(最壞的情況)適用:

          Array            BST

Space     O(n)             O(n)
Search    O(log n)         O(n)
Max/Min   O(1)             O(1) *
Insert    O(1) **          O(n)
Delete    O(n)             O(n)

* :最大/最小指針
** :攤銷時間復雜度

問:我想對這個問題更清楚。 在這兩者之間的這種情況下,我應該使用哪種數據結構? 請隨時討論其他數據結構,例如自平衡BST等。

編輯:

  1. 請注意,我沒有考慮平衡二進制搜索樹(RBTree等)的復雜性。 如前所述,使用二進制搜索樹進行的幼稚分析。

  2. 刪除已更新為O(n)(未考慮搜索節點的時間)。

  3. 傾斜的BST的最大值/最小值將花費O(n) 但是也可以存儲MaxMin指針,因此總體時間復雜度為O(1)

請參閱下表,這將幫助您選擇。 請注意,我假設有兩件事:

1)數據將始終按排序順序排列-您提到了這一點,即,如果最后插入的數據為1000,則新數據將始終大於1000-如果數據未按排序順序排列,則插入可以采用O(log n),但是刪除不會改變

2)您的“數組”實際上類似於java.util.ArrayList。 簡而言之,它的長度是可變的。 (比較可變和不可變的數據結構實際上是不公平的。)但是,如果它是普通數組,則刪除將使用攤銷的O(log n){O(log n)進行搜索,並使用O(1)進行刪除,攤銷如果需要創建新數組},則插入將分攤O(1){您需要創建新數組}

  ArrayList BST Space O(n) O(n) Search O(log n) O(log n) {optimized from O(n)} Max/Min O(1) O(log n) {instead of O(1) - you need to traverse till the leaf} Insert O(1) O(log n) {optimized from O(n)} Delete O(log n) O(log n) 

因此,基於此,ArrayList似乎更好

暫無
暫無

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

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