Search 如何在排序集中查找元素的索引?

Search 如何在排序集中查找元素的索引?,search,data-structures,binary-search-tree,sortedset,Search,Data Structures,Binary Search Tree,Sortedset,我可以在O(logN)中找到排序集(由BST支持)中的元素。现在我想要这个元素的索引。例如,在set{1,3,4,10}中,4的索引是2,1的索引是0 显然,我可以在集合上进行迭代,因此简单的解决方案是O(N)。我们是否可以使用BST属性和/或辅助数据结构做得更好 使用一个简单的BST,其中元素的插入顺序是随机的,您可以在不遍历树的情况下确定有多少元素比给定元素小 如果您有一个平衡树,例如红黑树,那么您至少可以根据树的高度边界在索引上设置上下限。 如果将元素插入BST的顺序是非随机的,那么您可以

我可以在
O(logN)
中找到排序集(由BST支持)中的元素。现在我想要这个元素的索引。例如,在set
{1,3,4,10}
中,
4
的索引是
2
1
的索引是
0


显然,我可以在集合上进行迭代,因此简单的解决方案是
O(N)
。我们是否可以使用BST属性和/或辅助数据结构做得更好

使用一个简单的BST,其中元素的插入顺序是随机的,您可以在不遍历树的情况下确定有多少元素比给定元素小

如果您有一个平衡树,例如红黑树,那么您至少可以根据树的高度边界在索引上设置上下限。 如果将元素插入BST的顺序是非随机的,那么您可以在不遍历它的情况下说明树的高度,并给出近似索引的一些估计

至于辅助数据结构,您可以创建一个辅助字典,将元素映射到它们的索引。但是,构建该索引需要O(N),并且当您向BST添加新元素时,索引将变得过时,因此这只适用于更新不频繁的BST

另一个解决方案是使用两个属性扩展BST节点:index和count。索引表示树中有多少元素小于此节点中的元素。计数表示上次更新该节点索引时BST中有多少元素。通过对BST上的插入、删除和搜索进行相对简单的更改,在固定时间之后不会影响这些基本操作,并且可以直接在O(1)中获取元素的索引

本质上,在插入新节点时,如果新元素较小(即,下一步是到左边的子节点),则对于向下传递的每个节点,增加该节点的索引和计数。找到新元素的位置后,将基于其父元素为其指定计数,并基于其父元素和左子元素为其指定索引。 这使得比新元素大的元素具有错误的索引,但您可以在搜索元素时通过引用父元素的计数值轻松更新该索引-父元素和子元素的计数之间的差异告诉您自上次更新子元素索引以来发生了多少次较小元素的插入,因此,您只需将该差异添加到索引中