【发布时间】:2016-06-08 21:21:51
【问题描述】:
我需要将一个元素插入排序范围,但我还需要知道它的索引(范围内小于该元素的元素数)。我想在 O(logN) 时间内做到这一点。我可以用基本的 C++ 容器做到这一点吗?
我正在考虑使用 std::multimap,通过这个容器,我可以将元素插入到它的位置,复杂度为 O(logN)。但是要获取索引,我需要调用 std::distance,它需要 O(N) 次操作,因为 multimap 迭代器不是随机访问。
另一种方法是使用排序 std::vector 和 std::binary_search 算法。在这种情况下,搜索需要 O(logN),但插入需要 O(N) 操作,因为插入到向量中间是线性操作。
那么,是否有 std/boost 容器可以用来达到结果,或者我需要为此实现自己的结构?谢谢!
【问题讨论】:
-
我没有跟上 Boost MultiIndex 的复杂性保证,但你可以看看
-
我猜在跟踪每个(内部)节点表示的元素数量时,可以使用自定义树/跳过列表实现。但是您是否知道,一旦您插入另一个项目,这样的索引就会失效?
-
我们所说的索引范围有多大?如果它不是那么大(几百万),您可以使用非常容易编码的 Fenwick 树。否则,您可以编写平衡二叉树并记住每个子树中的节点数。 AFAIK 标准容器在这里没有太大帮助。想知道,是否有什么东西在提升。
标签: c++ algorithm boost binary-search-tree binary-search