web-dev-qa-db-ja.com

セットの複雑さ::挿入

セットの挿入操作にはlog(n)時間しかかからないことを読みました。そんなことがあるものか?

挿入するには、まず、並べ替えられた配列内で、新しい要素が配置される場所を見つけます。バイナリ検索を使用すると、log(n)を取得します。次に、その場所に挿入するには、それに続くすべての要素を1つ右にシフトする必要があります。さらにn時間かかります。

私の疑問は、セットが配列として実装され、要素がソート順に格納されているという私の理解に基づいています。私の理解が間違っている場合は訂正してください。

17
bibbsey

std::setは通常、赤黒の二分探索木として実装されます。このデータ構造への挿入は、ツリーのバランスが保たれているため、最悪の場合O(log(n))複雑になります。

29
cdhowie

HashSet、LinkedHashSet、およびEnumSetのadd()、remove()、contains()の各操作には、定数O(1)これは内部のHashMap実装が原因です)のコストがかかります。

ツリー構造TreeMapおよびConcurrentSkipListMapの場合、put()、get()、remove()、containsKey()の操作時間はO(log(n))です。

したがって、TreeSetはO(log(n))時間の複雑さを持っています。

0
khawar