2016-10-26 4 views
4

アクセスのために時間複雑度O(log(N))を持つred-blackツリーとして実装されたstd :: mapを使用します(このサイトによれば:http://bigocheatsheet.com/)。これらのコンテナを積み重ねると、大きなOをどのように計算するのですか?スタッキングコンテナのBig O

たとえば、map<int, map<int, int>>です。一番内側の地図にアクセスするための大きなOは何ですか?

+0

*これらのコンテナをスタックする*とは? –

+1

同じです。 'map >'は、キーにアクセスする限り、 'map 'と同じです。 – NathanOliver

+0

あなたの質問はより正確に定式化する必要があります。何にアクセスする必要がありますか?既存の係数にはどのような仮定がありますか?たとえば、すべてのマップが同じサイズですか?マップは '[0,1、.. N]'にキーを持っていますか? 'N 'はサイズですか? –

答えて

3

あなただけだから、O(LOGN) + O(LOGN) = O(klogn) = O(LOGN)です

map<int, map<int, int>> data; 
const auto& lookup = data[5]; // here you spend O(logn) 
int value lookup2 = lookup[3]; // here you spend O(logn) 

、この場合には複雑さを合計する必要があります

ネストされたレベルの量はNには依存しませんが、彼らは常に一定であるので、これはO(LOGN)ようにmap<int, map<int, map<int, map<int, ..とした場合のもだろう。

2

それでもO(Log(N))

あなたが出てマップ内の第2のマップにアクセスする意味と仮定すると、それが背中合わせに基本的に2つのO(ログ(N))の操作です。したがって、O(2*log(N))は減少し、再びO(log(N))になります。

2

O(log(N))と同じです。

これは、「内部」マップを取得するためにO(log(N))を持っているため、この要素に対してO(log(N))を再度必要とするため、 N))であり、O(log(N))と同じである。

3

同じもの。 map<int, map<int, int>> mを持っていて、m[4][2]を検索したい場合、これは2つの独立したマップ検索です。したがって、それらを追加するだけです。O(log M + log N) = O(log MN)Mは外側のマップのサイズで、Nは内側のマップのサイズです。

外側と内側のマップサイズは独立していることに注意してください。

+0

複雑さが両方のサイズに依存しているという良い点 - 外側コレクションと内側コレクションですが、 'O'表記が2Dドメインを使用できるかどうかわかりません... –

+0

内側のマップが異なる場合あなたはN =平均サイズを取ることができますか?私は長い間正式な複雑さの分析を行っておらず、数十年にどれくらい忘れていたのかは驚くべきことです。 – molbdnilo

+1

@ W.F。もちろんそうです。 2つの独立した変数がある場合、両方に必要です。例えばDijkstraのアルゴリズムは 'O(E + VlgV)'です。 – Barry