二叉搜索树与有序元素的数组

时间:2016-06-25 06:53:08

标签: algorithm binary-search-tree complexity-theory

考虑要插入数组的数据总是有序的情况,即(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 {{1}进行辩论}。)

据我了解,以下费用(最坏情况)适用 -

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)&amp;的指针。 Max所以整体时间复杂度为Min

1 个答案:

答案 0 :(得分:0)

请参阅下表,这将有助于您选择。请注意,我假设有两件事:

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似乎更好