Enumerable.ElementAt <tsource> O(1)for HashSet?</tsource>

时间:2010-07-19 07:04:13

标签: .net time-complexity

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

ElementAt中没有HashSet方法,因此您可能希望在Enumerable.ElementAt的实例上使用时了解HashSet<T>方法的效果。

Enumerable.ElementAt方法针对实施IList<T>的类型进行了优化。在那种情况下,性能是O(1)。但是,HashSet不实现此接口,因此性能为O(n)。

答案 2 :(得分:2)

这取决于底层列表类型。反射器显示Enumerable<T>.ElementAt(...)首先尝试强制转换为IList<T>。在那种情况下,它将是O(1)。

例如,查询提供程序可能会返回IList<T>的内容。但是很可能如果你应用任何Linq运算符,它将变成IEnumerable<T>,因为它们仅使用不同的枚举器构建,并且它将变为O(n)。

编辑:我重读了HashSetHashSet<T>未实现IList<T>,因此它是O(n)。