Hashset vs Treeset
我一直都很喜欢树木,那个漂亮的O(n*lg(n))
和它们的整洁。 然而,我所知道的每一位软件工程师都尖锐地问我为什么要使用TreeSet
。 从CS背景来看,我认为它并不重要,而且我不关心哈希函数和存储区(以Java
)。
在哪种情况下,我应该在TreeSet
使用HashSet
?
HashSet比TreeSet快很多(对于大多数操作(例如add,remove和contains),常量时间与日志时间比较),但不提供TreeSet等顺序保证。
HashSet的
TreeSet中
SortedSet
) first()
, last()
, headSet()
和tailSet()
等有序集 重要的一点:
HashSet
和TreeSet
之间。 作为一个散列表实现,其中包含一个链表,但是它提供了插入顺序的迭代,它与TreeSet保证的排序遍历不同 。 所以使用的选择完全取决于你的需求,但是我觉得即使你需要一个有序集合,你仍然应该更喜欢HashSet来创建Set,然后将其转换为TreeSet。
SortedSet<String> s = new TreeSet<String>(hashSet);
TreeSet
尚未提及的一个优点是其具有更大的“局部性”,这是“(1)如果两个条目在顺序附近, TreeSet
将它们放在数据结构中彼此靠近,因此在内存中; (2)这种布局利用了局部性的原理,该局部性说明类似的数据经常被具有相似频率的应用程序访问。
这与HashSet
相反, HashSet
将条目遍布内存,而不管它们的密钥是什么。
当从硬盘读取数据的延迟成本是从缓存或RAM中读取数千倍的成本时,以及真正用本地访问数据时, TreeSet
可能是更好的选择。
HashSet
是O(1)来访问元素,所以它肯定很重要。 但是维持集合中对象的顺序是不可能的。
如果维护订单(按照值而不是插入顺序),则TreeSet
非常有用。 但是,正如您所指出的那样,您正在交易订单以获得访问元素的较慢时间:O(log n)用于基本操作。
从TreeSet
的javadocs:
此实现为基本操作( add
, remove
和contains
)提供了有保证的log(n)时间成本。
上一篇: Hashset vs Treeset