2016-06-11 4 views
0

O(logn)時間のバイナリ検索ツリーで最小/最大を見つけることができます。しかし、C++のmapは一定時間内に最小値/最大値を与えます。最小要素はmap::begin、最大値はmap::rbeginです。これらの操作はどちらも一定の時間がかかります。誰も最小/最大O(1)を見つける方法を提案できますか?O(1)時間の平衡二分探索時間の最小/最大要素

+2

ルートと共に2つのポインタをさらに格納します。 – molbdnilo

+0

std :: mapは通常、検索ツリーで実装されています。つまり、ハッシュマップを使って実装されたstd :: unordered_mapです。ハッシュマップは順序を気にしないので、O(1)でminを見つけることはできません。削除しないでO(1)のmin/maxを取得したいときは、min-heapまたはmax-heapをお勧めします。 – Exagon

+0

@Exagon:ordered_mapを意味します。 map :: rbeginとmap :: beginを見ることができます。 –

答えて

2

C++マップはBSTで実装されていません。 Red Black Treeによって実装されています。 BSTで最小値/最大値をO(1)で検索する場合は、ツリーの一番左のノードと一番右のノードに2つのポインタを格納できます。 それ以外の場合、minheapまたはmaxheapを使用してO(1)のmin/maxを調べることができます。

+0

はい、できます。しかし、最小/最大ノードの削除はポインタを変更します。それは新しい最小値/最大値を見つけるのにO(logn)を使います。 –

+0

いいえ、O(1)で再度実行できます。削除中にminノード(仮定)を削除しても、minノードのinorder successorにminポインタを更新することができます。だから、あなたはいつでもO(1)であなたの分を得ることができます。削除の複雑さが増しているといえます。しかし、それはまだO(logn)になります。 –

+0

レッド・ブラック・ツリーは、バイナリ・サーチ・ツリーでもあり、 – Exagon

関連する問題