我想知道以下功能的复杂性。
我知道std :: map实现为红黑树,插入的复杂度为O(logN)
但是如何计算我是否继续在空地图中添加N个项目?
void add(int N, std::map<int, int>& map) {
for (int i = 0; i < N; ++i) {
map[i] = i;
}
}
提前致谢,
答案 0 :(得分:2)
你做O(log N)事N次,所以它是O(N log N)。
答案 1 :(得分:2)
R-B树是一种平衡的二叉树。插入操作基本上找到插入位置,为新插入的节点分配空间并调整指针然后重新平衡R-B树。插入的复杂性是O(logN)。
因为在您的情况下,您首先要确定某些操作的复杂性,即插入日志(N)复杂度,然后找出操作使用的次数。这就是为什么我们有N(logN)。 O(logN)表示相对于容器中元素数量使用的时间增长顺序最多为logN。这并不意味着实际使用的时间是logN。
如果您的申请是时间评论家,您可以考虑使用unordered_map
,因为插入时间的复杂性是不变的。您正在从int映射到int,因此在这种情况下使用unordered_map应该完全没问题。
BTW:在你的公式中,没有定义log0,当没有要插入的元素时,你不进行插入操作。
答案 2 :(得分:2)
你问了一个合理的问题。
将N个项目插入到空白的树中时,您将从log(0)开始并进入log(N)。这意味着您的总体平均值实际为log(N/2)
而不是log(N)
。
在对数的情况下,这并没有真正有所作为 - 整体复杂性仍然是对数的。你所做的实际上是改变了对数的 base 。