【发布时间】:2016-10-27 19:24:54
【问题描述】:
考虑要插入到数组中的数据始终按顺序排列的场景,即(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>> 与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 等)的复杂性。如前所述,naive 分析使用二叉搜索树。
删除已更新为 O(n)(没有考虑时间来搜索节点)。
倾斜 BST 的最大/最小值将花费
O(n)。但也可以存储Max和Min的指针,因此总体时间复杂度将为O(1)。
【问题讨论】:
-
请指定如何实现 BST,搜索和插入可以优化到 O(logn),我也怀疑在 O(1) 中重新分级删除。以及您如何在删除后保持最小/最大值。
-
一个平衡的 BST 也应该是 O(log n) 用于搜索。
-
Insert 在 BST 上应该是 O(log n)。普通数组插入是 O(n);你怎么得到 O(1)?
-
在 BST 上删除应该是 O(log n)。
-
我认为因为数据总是按顺序插入,因此数组的 O(1) 而不是 O(n)。但是,在 BST 中的插入仍将保持 O(log n)
标签: algorithm binary-search-tree complexity-theory