我能否或为什么不能在std :: set中按索引搜索元素?

时间:2019-02-25 23:58:57

标签: c++ binary-search-tree c++-standard-library

此网站上有一些关于按索引访问std::set中的元素的问题,但是我看到的答案是古老且毫无启发性的。

有序集可以(并且经常)实现为二进制搜索树。在二叉搜索树中,通过将树的节点数存储在以每个节点为根的树中,我们可以在k时间内按排序顺序访问第O(log n)个元素,而不会增加其他操作的算法复杂度(如果这是我的想法中的错误,请纠正我。

尽管如此,如果我希望从k开始按顺序排列第set::set个元素,则必须使用begin()时间从O(k)一直到k, 。通常,这可能等于O(n)时间。

所以,我的问题是:

  • 我们可以维护一个高度平衡的二进制搜索树是否正确,在其中可以在k的时间内找到第O(log n)个元素,而又不会损害其他操作的时间复杂性?
  • 如果是,那么我可以利用C ++标准库中的函数或替代数据结构来实现此效果吗?
  • 如果对前者是肯定的而对后者则否,那么是否已经考虑或正在考虑?是因为某种技术障碍而没有实施,还是仅仅因为实施成本被认为对于该功能的潜在实用性来说太昂贵了?

1 个答案:

答案 0 :(得分:5)

有可能用额外的信息来扩充(平衡的)搜索树,该信息可用于在对数时间内实现按索引的搜索。这样的扩充搜索树可以称为order statistic tree

增强树不会影响主要操作(插入,查找,擦除)的最坏情况渐近复杂性:它们的最坏情况仍然是对数的。我不知道这是否可以防止有序关联容器的擦除和提示插入操作所需的摊余常数复杂性。

渐近复杂度并不是功能的唯一标准。增强树会增加对数运算的复杂度系数,从而使所有(或大多数)其他运算变慢。这也增加了数据结构的空间开销。因此,仅仅因为这样的数据结构是可能的,并不一定意味着使用它来实现标准库提供的通用关联容器是一个好主意。

不。标准库中没有基于带有对数索引查找功能的搜索树的容器。

我发现了基于Boost树组件库的提议n3700,该提议提议添加通用树结构。它包括类rank_tree,它似乎是一个增强的搜索树,提供了您正在寻找的操作。