[英]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等。
編輯:
請注意,我沒有考慮平衡二進制搜索樹(RBTree等)的復雜性。 如前所述,使用二進制搜索樹進行的幼稚分析。
刪除已更新為O(n)(未考慮搜索節點的時間)。
傾斜的BST的最大值/最小值將花費O(n)
。 但是也可以存儲Max
和Min
指針,因此總體時間復雜度為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.