将N个项插入到空std::映射的复杂性
Complexity of inserting N items to an empty std::map
我想知道以下函数的复杂性
我知道std::map是用红黑树实现的,插入的复杂度是O(logN(
但是,如果我一直在一个空地图上添加N个项目,我该怎么计算呢?
void add(int N, std::map<int, int>& map) {
for (int i = 0; i < N; ++i) {
map[i] = i;
}
}
提前感谢,
你做了N次O(log N(的事情,所以它是O(N log N(。
由于在您的情况下,您首先决定某个操作的复杂性,即插入log(N(复杂性,然后找出该操作的使用次数。这就是为什么我们有N(logN(。O(logN(表示所用时间相对于容器中元素数量的增长顺序最多为logN的顺序。这并不意味着实际使用的时间是logN。
如果您的应用程序是时间评论家,您可以考虑使用unordered_map
,因为插入时间复杂性是恒定的。您正在从int映射到int,因此在这种情况下使用unordered_map应该非常好。
BTW:在您的公式中,没有定义log0,当没有元素可插入时,您不执行插入操作。
你在问一个合理的问题。
当将N个项目插入到一个开始为空的树中时,您从日志(0(开始,然后前进到日志(N(。这意味着你的总体平均值实际上是log(N/2)
,而不是log(N)
。
在对数的情况下,这并没有真正的区别——总体复杂性仍然是对数的。你所做的实际上改变了对数的基数。
相关文章:
- C++匿名结构作为std::映射值
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 将唯一指针插入std::映射
- 重载std::映射不同的密钥类型
- std::映射,只有move构造函数可用
- std::映射服装比较函数和函数/lambda错误
- std::映射导致插入时出现C2664错误
- 将从std::映射中获取的std::pair引用传递给接受std::对引用的函数
- std::映射键作为模板化结构与枚举成员
- std ::映射以构造为钥匙
- 在锁定下清除STD ::映射,而移动到临时对象
- 计算向量的std ::映射为键的值,并将双倍作为值
- 写入/读取 std::映射到二进制文件需要运算符
- 我如何正确地为std ::映射分配内存
- 如何打印包含整数和整数集的std::映射
- 在字符串的std::映射中找到编译错误,long
- 将std ::映射复制到std ::对向量
- 使用std ::映射的键的部分匹配
- 遍历std ::映射,效果少于迭代器之间的比较