O(1)での実装HashSet.ElementAt
ですか?そうでない場合、それは何ですか?
3 に答える
いいえ、O(n)です。上のすべての拡張メソッドIEnumerable<T>
は、必然的にO(n)です(IEnumerable<T>
実行できるのは...列挙することだけだからです)。コメントで指摘されているように、操作をより高速に実装できるインターフェイスにキャストしようとします(たとえば、O(1)操作を実装するためにElementAt
キャストしようとします)。とにかく実装されていないIList<T>
場合には、それは役に立ちません。HashSet<T>
IList<T>
「HashSet<T>
ElementAt」の概念は、「順序付け」自体がないため、とにかく意味がありません。基本的には、ランダムな要素を取得しているだけです。
アンダーリストの種類によって異なります。リフレクターは、最初Enumerable<T>.ElementAt(...)
にキャストしようとすることを示しています。IList<T>
その場合はO(1)になります。
たとえば、クエリプロバイダーは、である何かを返す場合がありIList<T>
ます。ただし、Linq演算子のいずれかを適用すると、IEnumerable<T>
それらは単に異なる列挙子を使用して構築されるため、になり、O(n)になる可能性があります。
編集:私は読み過ぎましたHashSet
。AHashSet<T>
は実装されていないためIList<T>
、O(n)です。
にはElementAt
メソッドがないため、のインスタンスで使用した場合HashSet
のメソッドのパフォーマンスを知りたいと思うかもしれません。Enumerable.ElementAt
HashSet<T>
このEnumerable.ElementAt
メソッドには、を実装するタイプの最適化がありますIList<T>
。その場合、パフォーマンスはO(1)です。ただし、HashSetはこのインターフェイスを実装していないため、パフォーマンスはO(n)です。