【问题标题】:Number of elements less than X小于 X 的元素数
【发布时间】:2014-04-23 20:11:52
【问题描述】:

我需要一个可以快速(log N)计算小于某个值/修改值的元素数量的结构。我知道使用 R-B 树或类似树很容易,但我想通过使用已经实现这些树的 STL 来节省时间。但是,我找不到任何可以满足我需要的功能 - 是否有可能,可能使用某种技巧?我知道它需要存储每个子树中的元素数量,这可能不会正常进行。

【问题讨论】:

  • Boost Intrusive,但据我所知,STL没有什么好办法。
  • 你也需要快速插入和删除吗?
  • 如果你限制自己使用 G++,它有一个order-statistic tree implementation。那当然是如果你需要在线插入和删除,否则你可以使用排序数组。如果你有一个紧凑的宇宙或者你可以使用预处理来压缩它,你也可以使用binary-indexed tree
  • 是的,我也需要插入/删除。我想我会坚持自己编写 R-B 代码,因为我不能使用非标准库。
  • 顺便说一句,Treap 更快、更容易编写代码

标签: c++ algorithm stl


【解决方案1】:

您可以使用简单的排序向量或数组来做到这一点:

std::vector<int> V;
// (fill V with values)
std::sort(V.begin(), V.end());

int numValsLessThan5 = std::lower_bound(V.begin(), V.end(), 5) - V.begin();
int numValsLessThanOrEqualTo5 = std::upper_bound(V.begin(), V.end(), 5) - V.begin();

upper/lower_bound 在支持随机访问的容器上使用时具有对数复杂度。

【讨论】:

  • 你不能在 (log N) 中修改它,我想我应该提到这一点。
猜你喜欢
  • 2022-01-06
  • 2011-10-19
  • 2019-06-14
  • 1970-01-01
  • 2020-11-07
  • 2018-06-11
  • 1970-01-01
  • 2021-11-12
  • 2014-07-13
相关资源
最近更新 更多