Algorithm 插入/删除/排名/选择查询的最佳数据结构/算法

Algorithm 插入/删除/排名/选择查询的最佳数据结构/算法,algorithm,binary-search-tree,Algorithm,Binary Search Tree,到目前为止,我知道像AVL树和红黑树这样的自平衡BST可以在O(logn)次内完成这些操作 然而,要使用这些结构,我们必须自己实现AVL树或RB树 我听说有一种算法/实现这四种操作而不使用自平衡BST 根据我们自己定义的结构,我们需要写这么多行。然而,我听说有可能在不到100行代码中支持这四家运营商:\ 你们有什么想法吗 除了BST,还有其他可能的选项吗?如评论中所述,如果您想要维护一组整数,并且可以将坐标压缩作为预处理步骤(例如,因为您的算法处于脱机状态,并且知道所有未来的查询),则可以使用a

到目前为止,我知道像AVL树和红黑树这样的自平衡BST可以在O(logn)次内完成这些操作

然而,要使用这些结构,我们必须自己实现AVL树或RB树

我听说有一种算法/实现这四种操作而不使用自平衡BST

根据我们自己定义的结构,我们需要写这么多行。然而,我听说有可能在不到100行代码中支持这四家运营商:\

你们有什么想法吗


除了BST,还有其他可能的选项吗?

如评论中所述,如果您想要维护一组整数,并且可以将坐标压缩作为预处理步骤(例如,因为您的算法处于脱机状态,并且知道所有未来的查询),则可以使用a来支持O(日志n)中的数字插入/删除/排序/选择每次手术。下面是C++中的一个示例:

int-tree[N];//其中N是压缩坐标数
const int maxl=楼层(对数(N)/对数(2));

void insert(int i){//1?如果我根本不想使用任何BST怎么办?有其他方法吗?:)你可以使用一个跳过列表,它很容易实现,但不容易为rank/select增加。带有rank/select的treap也可以在不到60行的代码中实现哦,如果你在一个小范围内插入/删除整数(比如[0,100000])或者,如果您可以脱机预处理查询以对其进行压缩,则可以使用二元索引树。使用这种方法,秩为O(log n),选择为O(log^2 n)。谢谢大家。我已尝试使用二元索引树,首先对所有查询进行预计算。这样,我们就不必处理最大值为10^9的问题(因为总数只有50000)二叉索引树的代码非常短,速度也很快。但是,您如何分析select算法的复杂性?我认为这里描述的“插入”和“删除”操作与您所做的不同。我相信OP所说的是“将一个元素插入一个集合”与“在插槽x中插入另一个大理石”相比,@templatetypedef请解释其区别:)假设您已经预先计算了一个从您的宇宙到整数集的双射函数[1..N],例如通过排序。这是一种离线算法,allI假设目标是存储一组有序的元素S,支持插入、删除操作,以及“第k个最小元素是什么?”和“集合S中元素x的索引是什么?”同样,这里的insert、delete、rank和select的含义可能完全不同。@templatetypedef这正是我的示例代码所做的。但是,您需要将您的宇宙映射到[1..N]范围内的整数.这就意味着操作的运行时间与宇宙大小的对数与元素数量的对数成正比,对于不能被双射到整数的字符串这样的对象,它不起作用?