【问题标题】:Is there a sorted data structure with logarithmic time insertion, deletion and find (with distance)?是否存在具有对数时间插入、删除和查找(带距离)的排序数据结构?
【发布时间】:2019-02-09 17:15:21
【问题描述】:

我有一个排序数组,在​​该数组中,我在 O(logn) 时间使用二分搜索 (std::upper_bound) 找到小于特定值的项目数。
现在我想从这个数组中插入和删除,同时保持它的排序。我希望整体复杂度为O(logn)

我知道使用二叉搜索树或std::multiset 我可以在O(logn) 中进行插入、删除和upper_bound,但我无法以对数形式获得距离/索引(std::distanceO(n) 的集合)时间。

那么有没有办法实现我想做的事情?

【问题讨论】:

  • 请修改您的问题 - 数组本身就是一种线性数据结构,因此插入或删除不会像您预期的那样便宜。
  • 取决于您的数据有多大,排序数组受益于连续性(缓存友好),因此如果您继续使用数组,在任何位置插入/删除std::lower_bound/@987654329,您可能会获得更好的性能@告诉你。
  • 这不是建议问题的重复,这是寻找比O(n) index/distance 更好的问题。虽然我认为插入的要求与那个 tbh 是互斥的。
  • n 的范围和您应该存储的元素的值是多少?
  • 范围高达 10^5,值从 -10^9 到 10^9

标签: c++ algorithm data-structures


【解决方案1】:

您可以通过在每个节点中包含“子树大小”数据成员(以及标准的“左孩子”、“右孩子”)来扩充任何平衡二叉搜索树数据结构(例如红黑树) , 和“价值”成员)。然后,当您从根向下导航到该元素时,您可以计算小于给定元素的元素数。

它增加了一些记账,当然这意味着您需要使用自己的平衡二叉搜索树实现而不是标准库中的实现;但它是相当可行的,并且不会影响任何操作的渐近复杂度。

【讨论】:

    【解决方案2】:

    您可以在每个节点中使用具有左子树大小的平衡 BST 来计算距离

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2021-06-23
      • 1970-01-01
      相关资源
      最近更新 更多