9

O(1)での実装HashSet.ElementAtですか?そうでない場合、それは何ですか?

4

3 に答える 3

5

いいえ、O(n)です。上のすべての拡張メソッドIEnumerable<T>は、必然的にO(n)です(IEnumerable<T>実行できるのは...列挙することだけだからです)。コメントで指摘されているように、操作をより高速に実装できるインターフェイスにキャストしようとします(たとえば、O(1)操作を実装するためにElementAtキャストしようとします)。とにかく実装されていないIList<T>場合には、それは役に立ちません。HashSet<T>IList<T>

HashSet<T>ElementAt」の概念は、「順序付け」自体がないため、とにかく意味がありません。基本的には、ランダムな要素を取得しているだけです。

于 2010-07-19T07:07:53.020 に答える
3

アンダーリストの種類によって異なります。リフレクターは、最初Enumerable<T>.ElementAt(...)にキャストしようとすることを示しています。IList<T>その場合はO(1)になります。

たとえば、クエリプロバイダーは、である何かを返す場合がありIList<T>ます。ただし、Linq演算子のいずれかを適用すると、IEnumerable<T>それらは単に異なる列挙子を使用して構築されるため、になり、O(n)になる可能性があります。

編集:私は読み過ぎましたHashSet。AHashSet<T>は実装されていないためIList<T>、O(n)です。

于 2010-07-19T07:13:32.183 に答える
2

にはElementAtメソッドがないため、のインスタンスで使用した場合HashSetのメソッドのパフォーマンスを知りたいと思うかもしれません。Enumerable.ElementAtHashSet<T>

このEnumerable.ElementAtメソッドには、を実装するタイプの最適化がありますIList<T>。その場合、パフォーマンスはO(1)です。ただし、HashSetはこのインターフェイスを実装していないため、パフォーマンスはO(n)です。

于 2010-07-19T07:10:49.177 に答える