Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分类集<;T>;vs HashSet<;T>;_C#_.net_Collections_Generics - Fatal编程技术网

C# 分类集<;T>;vs HashSet<;T>;

C# 分类集<;T>;vs HashSet<;T>;,c#,.net,collections,generics,C#,.net,Collections,Generics,我的问题是,当我们有SortedSet时,HashSet需要什么!SortedSet中也提供了所有HashSet方法,而且SortedSet具有优势,因为它已经以排序方式提供了集合!即使如此,HashSet仍然存在。那么它有什么用处呢?如果您不需要排序,就不应该使用进行排序的类,因为这意味着您的应用程序将做更多的工作。(换句话说,这将使你的应用程序更快)。这是关于为工作选择正确的工具。取决于您使用收藏的方式 有一个很好的表格,详细说明了不同集合类之间的差异 以下是该表中有关您询问的收藏的摘录:

我的问题是,当我们有
SortedSet
时,
HashSet
需要什么!SortedSet中也提供了所有HashSet方法,而且SortedSet具有优势,因为它已经以排序方式提供了集合!即使如此,HashSet仍然存在。那么它有什么用处呢?

如果您不需要排序,就不应该使用进行排序的类,因为这意味着您的应用程序将做更多的工作。(换句话说,这将使你的应用程序更快)。

这是关于为工作选择正确的工具。取决于您使用收藏的方式

有一个很好的表格,详细说明了不同集合类之间的差异

以下是该表中有关您询问的收藏的摘录:

Collection Ordering Contiguous Storage? Direct Access? Lookup Efficiency Manipulate Efficiency SortedSet Sorted No Via Key Key:O(log n) O(log n) HashSet Unordered Yes Via Key Key:O(1) O(1) 集合排序连续存储?直接访问?查找效率操纵效率 已分拣数据集已分拣号通过键:O(日志号)O(日志号) 哈希集无序是通过键:O(1)O(1)
都在实现一个包含唯一元素的数据结构

它们之间的主要区别在于用于存储数据的底层数据结构。
HashSet
使用一个哈希表
SortedSet
使用一个红黑树,这是一个平衡的二叉树

使用哈希表的
HashSet
SortedSet
更快地执行基本操作(即添加、删除、搜索),因为
HashSet
的复杂度为O(1),这意味着它将在恒定的时间段内执行与输入数据大小无关的基本操作,而
SortedSet
的复杂度为log(N)意思取决于输入的大小,它会做对数的基本运算。例如,如果输入数据的大小为1000,则程序将分10步执行基本操作;如果输入数据的大小为1000000,则程序将分20步执行基本操作


结论:如果不需要对元素进行排序,请使用
HashSet
,否则请使用
SortedSet
。这意味着除非您需要排序,否则最好使用
HashSet

更重要的是,该算法运行速度更快。散列是O(1),而排序集可能使用二叉搜索树,一般情况下是O(logn)——性能差得多。集合用于唯一项,列表可能包含重复项。对于HashSet文档。它说:集合是一个不包含重复元素的集合,其元素没有特定的顺序。它是算法计算强度的粗略指标。参见@newoil:用外行的话来说,在
O(1)
中运行的算法意味着它在相同的时间内运行,而不管输入的大小。否则,时间取决于输入
n
的大小,并表示为
n
的函数。e、 例如,线性:
O(n)
,二次:
O(n^2)
,等等。big-O wiki页面可能很难阅读,我认为有人对其进行了很好的总结。@BlueMonkMN,在线版本(MSDN)与旧的错误版本相比显然是固定的。
SortedSet
在O(logn)时间内执行查找,在O(1)时间内执行
HashSet
查找,在O(n)时间内执行
列表
查找。HashSet是否希望项目未排序且唯一?从MSDN>中,HashSet类提供>高性能集操作。集合>是不包含>重复元素且其元素>没有特定顺序的集合。如果你有一套东西一开始就没有很好的顺序,那该怎么办?例如,如何在三个空间中创建一组排序的点?在使用
HashSet
时,需要知道一件有用的事情:即使在64位应用程序中,它也可以存储多达4800万个
Guid
s或
long
s或9500万个
int
s,然后抛出
OutOfMemoryException
SortedSet
似乎具有更高的容量限制。如果出于某种原因需要在内存中保留数亿项,
HashSet
可能不是一个好选择。@Vladimir:根据文档,“对于非常大的HashSet对象,您可以通过在运行时环境中将configuration元素的enabled属性设置为true,将64位系统上的最大容量增加到20亿个元素。”我看到您链接的文章将基于哈希表的类型(
Dictionary
HashSet
)列为“continuous”“-但是它们不会在内部(通常是稀疏的)键数组中连续存储它们的键,而
SortedDictionary
SortedSet
使用一个密集的树,所以我很惊讶这篇文章没有涉及不同键数的SortedSet与HashSet的内存使用情况。@从技术上讲,HashSet中的Svisstack查找是O(m)其中m是哈希函数的平均哈希冲突率。对于完全均匀分布的哈希函数,其结果是查找为O(1),对于总是冲突的完全糟糕的哈希函数,其结果是查找为O(n),其中n是集合的大小。您通常只使用具有良好哈希函数的类型的哈希集,在大多数实际情况下使其成为O(1)。是什么让你认为它是O(log(n))?@Svisstack“你不能假设你的哈希函数是好的”嗯,你可以。大多数人都是这样。如果无法正确散列对象,则不应在基于散列的集合中使用它。有些人会在这个符号上加一个星号来表示它假设了一个好的散列,因为你是对的,它是在声明O(1)时做出的一个假设,即使它是一个有效的假设。“如果你有一只牧羊犬