2016-10-26 3 views
4

Я использую std :: map, которая реализована как красно-черное дерево со сложностью времени O (log (N)) для доступа (согласно этому сайту: http://bigocheatsheet.com/). Как вычислить большой O, если я складываю эти контейнеры.Big O при укладке контейнеров

Например, map<int, map<int, int>>. Что такое большой O для доступа к самой внутренней карте?

+0

* складывать эти контейнеры * означает? –

+1

То же самое. «Карта >' ничем не отличается от 'map ' как доступ к ключу. – NathanOliver

+0

Ваш вопрос должен быть сформулирован более точно. Что вам нужно получить? Какие предположения вы можете сделать по существующим коэффициентам? Например, все карты имеют одинаковый размер? Любая карта имеет ключи в '[0,1, .. N]' где 'N' - размер? –

ответ

3

Вам просто нужно суммировать сложности в этом случае

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) 

Так что O (LOGN) + O (LOGN) = O (klogn) = O (LOGN).

Это было бы O (LOGN) также в случае map<int, map<int, map<int, map<int, .. и так далее, потому что количество вложенных уровней не зависит от N но они всегда постоянные.

2

Еще O(Log(N))

Предполагая, что вы имели в виду доступа ко второй карте в выездном карте, это по существу две O (журнал (N)) операций спина к спине. Следовательно, O(2*log(N)), который уменьшен до O(log(N)).

2

Это то же самое, O (log (N)).

Это потому, что у вас есть O (log (N)), чтобы получить «внутреннюю» карту, тогда вам понадобится O (log (N)) снова для элемента, так что в итоге у вас есть O (2 * log (N)), который совпадает с O (log (N)).

3

То же самое. Если у вас есть map<int, map<int, int>> m и вы хотите найти m[4][2] - это всего лишь два независимых поиска по карте. Поэтому вы просто добавляете их: O(log M + log N) = O(log MN) где M - размер внешней карты, а N - размер внутренней карты.

Обратите внимание, что размеры внешних и внутренних карт независимы.

+0

Хорошая точка в том, что сложность зависит от обоих размеров - внешней и внутренней коллекции, однако я не уверен, что обозначение «O» позволяет использовать 2D-домен ... –

+0

Имеет ли значение, если внутренние карты отличаются друг от друга размеры, или вы можете просто взять N = средний размер? Я долгое время не делал формального анализа сложности, и удивительно, как много вы забываете всего за пару десятилетий. – molbdnilo

+1

@ W.F. Конечно. Если у вас есть две независимые переменные, вам нужно обоим. например Алгоритм Дейкстры - «O (E + VlgV)». – Barry