是否存在具有对数时间插入,删除和查找(带有距离)的排序数据结构?

时间:2019-02-09 08:07:04

标签: c++ algorithm data-structures

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

我知道使用二叉搜索树或std::multiset可以在O(logn)中进行插入,删除和upper_bound,但是我无法获得距离/索引(std::distance是{{ 1}}(对数时间)。

那么有什么方法可以实现我想做的事吗?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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