对于HashSet,Enumerable.ElementAt <TSource> O(1)?

Fil*_*erg 7 .net time-complexity

HashSet.ElementAtO(1)中的实现,如果不是,它是什么?

Dea*_*ing 5

不,是 O(n)。所有的扩展方法IEnumerable<T>都必须是 O(n)(因为唯一IEnumerable<T>可以做的就是......枚举)。虽然,正如评论中所指出的,他们确实尝试转换为可以更快地实现操作的接口(例如,ElementAt将尝试转换IList<T>为以实现 O(1) 操作)。并不是说在无论如何HashSet<T>都没有实施的情况下有帮助IList<T>

因为HashSet<T>“ElementAt”的概念无论如何都没有意义,因为没有这样的“排序”。你基本上只是得到一个随机元素。

  • @Dean:不要忘记数组和 List&lt;T&gt; 类型的 `Enumerable` 类中的性能优化。对于这些类型,一些操作实际上是 O(1)。 (3认同)
  • 是的,单个 `ToArray` 然后多个“元素 at”(通过 `[]` 运算符)会快得多。HashSet 没有“正确”顺序这样的东西,因为元素没有以任何有意义的方式排序。 (2认同)