【发布时间】:2019-11-14 04:50:19
【问题描述】:
Java TreeSet 类可以为 add 方法维护 O(logN) 成本。如果按排序顺序输入数据,这将如何工作?
既然二叉搜索树的 add 方法在给定排序数据时会退化到 O(N),为什么 TreeSet 不会发生这种情况?
【问题讨论】:
标签: java tree binary-search-tree treeset
Java TreeSet 类可以为 add 方法维护 O(logN) 成本。如果按排序顺序输入数据,这将如何工作?
既然二叉搜索树的 add 方法在给定排序数据时会退化到 O(N),为什么 TreeSet 不会发生这种情况?
【问题讨论】:
标签: java tree binary-search-tree treeset
您的错误是认为TreeSet 使用简单二叉搜索树。
它没有。它使用自平衡二叉搜索树。
TreeSet 的 Javadoc 说:
NavigableSet实现基于TreeMap。
TreeMap 的 Javadoc 说:
基于
NavigableMap实现的红黑树。 [...]此实现为
containsKey、get、put和remove操作提供有保证的 log(n) 时间成本。算法改编自 Cormen、Leiserson 和 Rivest 的Introduction to Algorithms中的算法。
因此,如果您想查看特定算法的描述,请找到那本书并阅读它。
您也可以做一些research 并查看红黑树的工作原理,例如见Wikipedia,上面写着:
红黑树是计算机科学中的一种self-balancing binary search tree。
[...]
树的平衡并不完美,但足以让它保证在
O(log n)时间搜索,其中n是树中元素的总数。插入和删除操作,以及树的重新排列和重新着色,也在O(log n)时间执行。
然后详细描述所有工作原理。
【讨论】:
欢迎来到 StackOverflow!
给定排序数据时,二叉搜索树的 add 方法将退化为 O(N)
对于 TreeSet 类,情况并非如此。
TreeSet 类的实现依赖于红黑树 数据结构。基本上,在将新元素添加到红黑树之后,树会按照一些规则重新平衡。
我推荐阅读Insertion section of the wikipedia page关于这个主题!
【讨论】: