std::map
应该使用二叉搜索树来实现,它也会对它们进行排序。
我需要快速插入并快速检索元素。我还需要不时获得第一个最低N元素。
我在考虑使用std::map
,这是一个不错的选择吗?如果是,我需要什么时间来检索最低的N个元素?为O(n * logn)时间?
答案 0 :(得分:2)
您可以使用迭代器快速读取最低N个元素。从begin()
到第N-1个元素将花费O(n)时间(获得下一个元素是std::map
的摊销常数时间。)
但是,我注意到,使用带有二进制斩波搜索方法的排序std::vector
实际上通常会更快,这取决于您的确切要求,这可能是值得的调查。
答案 1 :(得分:2)
C ++标准要求所有必需的迭代器操作(包括迭代器增量)都是分摊的常量时间。因此,获取容器中的前N个项目必须按O(N)
时间摊销。
答案 2 :(得分:2)
鉴于你需要检索和n最小,我会说std::map
是合理的选择。但取决于具有排序的确切访问模式std::vector
也可能是一个不错的选择。
我不确定你的意思是检索。读 k 元素的时间是O( k )(假设您使用迭代器按顺序执行),删除它们的时间是O( k log n )( n 是元素的总量;即使使用迭代器按顺序执行也是如此。)
答案 3 :(得分:1)
我会对这两个问题说“是”。