SortedSet <T> vs HashSet <T>

Bat*_*rry 45 .net c# generics collections

我的问题是我们什么HashSet<T>时候需要什么SortedSet<T>!所有HashSet的方法也可以在SortedSet中使用,而且SortedSet是有利的,因为它已经以排序的方式提供集合!即便如此,HashSet仍然存在.那有什么用呢?

Jac*_*cob 71

如果不需要排序,你不应该使用,它的排序,因为这意味着你的应用程序将被做得比它需要更多的工作一类.(换句话说,它会让你的应用更快).

  • Set用于唯一项目,List可能包含重复条目.http://msdn.microsoft.com/en-us/library/bb359438.aspx用于HashSet <T>文档.它说:集合是一个包含_no duplicate elements_的集合,其元素没有特定的顺序. (14认同)
  • 更重要的是,算法运行得更快.散列是O(1),而排序集可能使用二叉搜索树,在平均情况下是O(log n) - 性能差得多. (10认同)
  • @BlueMonkMN,在线版本(MSDN)与旧的错误版本相比显然是固定的.`SortedSet <>`在O(log n)时间执行查找,在O(1)时间执行`HashSet <>`,在O(n)时间执行`List <>`. (4认同)
  • 它是算法计算强度的粗略指标.见http://en.wikipedia.org/wiki/Big_O_notation (2认同)
  • @Novice:在外行人看来,运行在"O(1)"中的算法意味着无论输入的大小如何,它都会在相同的时间内运行.否则,时间取决于输入"n"的大小,并表示为"n"的函数.例如,线性:"O(n)",二次方:"O(n ^ 2)"等.大O维基页面可能很难读,[这](http://en.wikipedia.org/ wiki/Time_complexity#Table_of_common_time_complexities)我认为很好地总结了它. (2认同)

Zar*_*dan 45

这是关于为工作选择合适的工具.取决于您将如何使用您的收藏.

这个页面有一个很好的表格,详细说明了各种集合类之间的差异.

以下是该表中有关您询问的集合的摘录:

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)

  • @Svisstack 从技术上讲,哈希集中的查找是 O(m),其中 m 是哈希函数的平均哈希冲突率。对于完全均匀分布的哈希函数,查找结果为 O(1),对于总是发生冲突的完全糟糕的哈希函数,查找结果为 O(n),其中 n 是集合的大小。通常,您只使用具有良好哈希函数的类型的哈希集,在大多数实际情况下使其成为 O(1)。是什么让你认为它是 O(log(n)) ? (2认同)
  • @Svisstack“你不能假设你的哈希函数是好的”好吧,你*可以*。大多数人都这样做。如果您无法正确散列该对象*您不应该在基于散列的集合中使用它*。有些人会在该符号上加一个星号,表示它假设一个好的散列,因为你是对的,它*是*在陈述 O(1) 时所做的假设,即使它是一个有效的假设。“如果发生碰撞,那么您基本上已经设置了”不,那么您就有了一个列表。搜索它需要线性搜索,其时间复杂度为 O(m),其中 m 是该哈希桶中的项目数。 (2认同)

小智 18

二者HashSet<T>SortedSet<T>正在执行interface 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>可取的,除非您需要排序。