考虑要插入数组的数据总是有序的情况,即(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等。
编辑:
请注意我没有考虑平衡二叉搜索树(RBTree等)的复杂性。如上所述,使用二叉搜索树进行天真分析。
删除已更新为O(n)(没考虑时间搜索节点)。
偏斜BST的最高/最低费用为**
。但也可以存储O(n)
&amp;的指针。 Max
所以整体时间复杂度为Min
。
答案 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似乎更好