【发布时间】:2019-02-09 17:15:21
【问题描述】:
我有一个排序数组,在该数组中,我在 O(logn) 时间使用二分搜索 (std::upper_bound) 找到小于特定值的项目数。
现在我想从这个数组中插入和删除,同时保持它的排序。我希望整体复杂度为O(logn)。
我知道使用二叉搜索树或std::multiset 我可以在O(logn) 中进行插入、删除和upper_bound,但我无法以对数形式获得距离/索引(std::distance 是O(n) 的集合)时间。
那么有没有办法实现我想做的事情?
【问题讨论】:
-
请修改您的问题 - 数组本身就是一种线性数据结构,因此插入或删除不会像您预期的那样便宜。
-
取决于您的数据有多大,排序数组受益于连续性(缓存友好),因此如果您继续使用数组,在任何位置插入/删除
std::lower_bound/@987654329,您可能会获得更好的性能@告诉你。 -
这不是建议问题的重复,这是寻找比
O(n)index/distance 更好的问题。虽然我认为插入的要求与那个 tbh 是互斥的。 -
n的范围和您应该存储的元素的值是多少? -
范围高达 10^5,值从 -10^9 到 10^9
标签: c++ algorithm data-structures