繁体   English   中英

用于检索集合中第k个最小/最大项目的数据结构(在STL或Boost中)?

[英]Data structure (in STL or Boost) for retrieving kth smallest/largest item in a set?

我正在寻找具有以下属性的C ++ STL或boost中的数据结构:

  • 检索O(log n)时间中第k个最大项
  • 搜索O(log n)时间
  • O(log n)时间删除

如果不存在这样的数据结构实现,是否有办法用额外的数据(例如,集合)来适应不同的数据结构,从而实现上述可能?

注意:我发现c-stl中有任何数据结构可以进行插入搜索和r ,但这已经有5年的历史了,没有提到boost。

目前,我假设元素是唯一的,并且至少有k个元素。 如果没有,则可以类似地使用多集。

您可以使用C ++中的两个set完成此操作:

#include <set>

集合1:我们称其为Large 它仅保留k个最大元素。

第2组:我们称其为休息 它保留其余元素。

搜索 :只搜索两个集合,因为两个集合都是红黑树,所以取O(log n)。

删除 :如果元素处于静止状态 ,则将其删除。 如果不是,请将其从large删除,然后从其余部分删除最大的元素,然后将其放入large 从红黑树删除需要O(log n)。

插入新元素(初始化):每次出现新元素时:(1)如果large少于k个元素,则将其添加到large中 (2)否则,如果该元素大于大的最小元素,则删除该最小并将其移动到rest 然后,将新元素添加到large 如果以上都不是,只需将新元素添加到rest即可 删除和插入红黑树需要O(log n)。

这样, 总是具有k个最大元素,而最小的元素就是您想要的第k个最大元素。

我留给您查找如何在集合中进行搜索,插入,查找最小值,查找最大值和删除的操作。 没那么难。 但是所有这些操作在平衡的二进制搜索树上采用O(log n)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM