C++ 堆放集装箱时的大O形标志

C++ 堆放集装箱时的大O形标志,c++,stl,big-o,C++,Stl,Big O,我使用一个std::map实现为红黑树,时间复杂度为O(log(N))(根据这个站点:)。如果我堆叠这些容器,如何计算大O 例如map。访问最里面地图的大O是什么?仍然O(Log(N)) 假设您的意思是访问outmap中的第二个map,那么实际上是两个O(log(N))操作背靠背。因此,O(2*log(N)),它又被简化为O(log(N))。在这种情况下,您只需要对复杂性求和 map<int, map<int, int>> data; const auto& lo

我使用一个std::map实现为红黑树,时间复杂度为O(log(N))(根据这个站点:)。如果我堆叠这些容器,如何计算大O

例如
map
。访问最里面地图的大O是什么?

仍然
O(Log(N))


假设您的意思是访问outmap中的第二个map,那么实际上是两个O(log(N))操作背靠背。因此,
O(2*log(N))
,它又被简化为
O(log(N))

在这种情况下,您只需要对复杂性求和

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)
地图数据;
const auto&lookup=数据[5];//这是你花的钱(logn)
int-value lookup2=查找[3];//这是你花的钱(logn)
所以它是O(logn)+O(logn)=O(klogn)=O(logn)

这将是O(logn),在
map的情况下也是如此,O(logn))


这是因为您需要O(log(N))来获得“内部”映射,然后您需要O(log(N))再次用于元素,因此总共有O(2*log(N))与O(log(N))相同。

同样的事情。如果你有
map m
,你想查找
m[4][2]
——那只是两个独立的map查找。因此您只需添加它们:
O(logm+logn)=O(logmn)
其中
M
是外部映射的大小,
N
是内部映射的大小


请注意,外部贴图大小和内部贴图大小是独立的

堆叠这些容器意味着什么?它是一样的。
map
map
在访问密钥方面没有什么不同。您的问题需要更精确地表述。您需要访问什么?您可以对现有系数做出哪些假设?例如,所有地图的大小是否相同?是否有任何地图在
[0,1,…N]
中有键,其中
N
是大小?@emeraldwearm True,我应该提到我想访问最里面的地图。但我认为,当谈论大O时,总是假设大小收敛到无穷大。我错了吗?假设您想在最内部的映射中查找键
j
,并且其中只有一个有这样的键,但您不知道是哪一个。这完全改变了你对它的思考方式。很好的一点是,复杂性取决于两种大小——外部集合和内部集合,但是我不确定
O
notation是否允许使用2D域……如果内部贴图的大小不同,这会有区别吗?或者你可以只取N=平均大小吗?我已经很长时间没有做过正式的复杂性分析了,令人惊讶的是,在短短几十年的时间里,你竟然忘记了这么多东西。@W.F.当然了。如果你有两个自变量,你需要同时考虑这两个。e、 g.Dijkstra的算法是
O(e+VlgV)
@molbdnilo,因为我们刚刚添加了“我将取最大值”。@Barry总之,为什么不能在
O
中使用两个变量呢。说得好,谢谢!