我的问题是:既然有SortedSet<T>
,那为什么还需要使用HashSet<T>
呢?毕竟在SortedSet中,所有HashSet的方法都是可用的,并且SortedSet还有一个优势,即提供了已排序的集合!即使如此,HashSet仍然存在。那它到底有什么用处呢?
我的问题是:既然有SortedSet<T>
,那为什么还需要使用HashSet<T>
呢?毕竟在SortedSet中,所有HashSet的方法都是可用的,并且SortedSet还有一个优势,即提供了已排序的集合!即使如此,HashSet仍然存在。那它到底有什么用处呢?
O(1)
时间复杂度的算法意味着它无论输入的大小如何,都会以相同的时间运行。否则,时间将取决于输入的大小n
,并表示为n
的函数。例如,线性:O(n)
,二次方:O(n^2)
等。大O符号维基页面可能很难理解,这个总结得很好。 - Jeff MercadoSortedSet<>
的查找时间是 O(log n),HashSet<>
是 O(1),而 List<>
是 O(n)。 - Lucero集合 | 排序 | 连续性? | 直接访问? | 查找 | 操作 | 备注 |
---|---|---|---|---|---|---|
HashSet | 无序 | 是 | 通过键 | 键:O(1) | O(1) | 唯一的无序集合,类似于字典,但键和值是同一个对象。 |
SortedSet | 排序 | 否 | 通过键 | 键:O(log n) | O(log n) | 唯一的排序集合,类似于排序字典,但键和值是同一个对象。 |
注意:
HashSet<T>
和SortedSet<T>
都实现了接口ISet<T>
,这是一种保存唯一元素的数据结构。
它们之间的主要区别在于它们用于存储数据的底层数据结构。 HashSet<T>
使用哈希表,而SortedSet<T>
使用红黑树,这是一种平衡的二叉树。
使用哈希表的HashSet<T>
比SortedSet<T>
执行基本操作(即添加、删除、查找)更快,因为HashSet<T>
的复杂度为O(1),这意味着它将独立于输入数据大小在恒定的时间内执行基本操作,而SortedSet<T>
的复杂度为log(N),这意味着它将根据输入的大小以对数方式执行基本操作。例如,如果输入数据的大小是1,000,则程序在10个步骤中执行基本操作,如果是1,000,000,则程序在20个步骤中执行基本操作。
HashSet<T>
,否则请使用SortedSet<T>
。这意味着使用HashSet<T>
是更可取的,除非您需要排序。
HashSet<T>
时需要知道的一个(有时候)有用的事情是:即使在 64 位应用程序中,它也可以存储多达 ~4800 万个Guid
或long
或 ~9500 万个int
,之后会抛出OutOfMemoryException
。SortedSet<T>
的容量极限似乎要高得多。如果因某些原因需要在内存中保留数亿个项目,则HashSet<T>
可能不是一个好选择。 - Vladimir Reshetnikov