algorithm - 回答有关给定范围内不同数字数量的查询

标签 algorithm data-structures binary-indexed-tree

问题

我有一个包含 N 个数字的数组。这些数字可能是不同的,也可能是无序的。我必须回答关于 A 和 B 之间有多少个不同数字的 Q 查询。其中 A、B 是 0 <= A <= B < array.Length 之间的索引。

我知道如何使用 HashTable 为每个查询完成 O(N),但我要求更有效的解决方案。 我试图用 sqrt 分解和线段树来改进它,但我做不到。我没有展示任何代码,因为我没有找到任何可行的想法。 我正在找人解释更快的解决方案。

更新

我读到您可以收集查询,然后使用二叉索引树 (BIT) 回答所有问题。有人可以解释如何去做。假设我知道 BIT 是如何运作的。

最佳答案

对于每个索引 i,找到具有相同值的前一个索引 prev[i](如果没有这样的索引,则为 -1)。它可以通过使用 hash_map 从左到右在 O(n) 平均时间内完成,然后索引范围 [l;r) 的答案是 i 中的元素数范围 [l;r) 使得它们的值小于 l (这需要一些思考但应该清楚)

现在我们将解决问题“给定范围 [l;r) 和值 c 找到小于 c 的元素数”在数组 prev 上。如果我们在每个顶点中保存其范围(子树)中的所有数字,则可以使用线段树在 O(log^2) 中完成。 (在每个查询中,我们将获得 O(log n) 个顶点并在其中进行二分查找)

关于algorithm - 回答有关给定范围内不同数字数量的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48134696/

相关文章:

algorithm - 往返经纬度和3D点的可逆算法

python - Forster-Overfelt 版本的 Greiner-Horman 多边形裁剪算法的伪代码有什么问题?

java - 我如何针对 CyclicShift 优化此 Java 代码(Hackerearth 问题)?

Python:访问嵌套数据结构

c++ - 在 char 数组中查找不重复的字母。我的程序运行错误。需要帮忙

algorithm - RMQ使用两个fenwick树(二叉索引树)

algorithm - 查找范围内权重为 k 的项目数(包含更新和查询)

arrays - 如何在两个数组中查找倒序对?

algorithm - Fenwick Trees 中的更新步骤

JavaScript数据结构: Set of page widths with associated values