algorithm - 给定一个数组,以及对索引 `i j` 的一系列查询,我如何有效地找出哪个索引被查询的次数最多?

标签 algorithm data-structures

给定一个数组 A,索引从 0n-1 其中 n 是数组的大小数组,以及一系列形式为 i j 的查询,其中 ij 表示索引(ij inclusive), 如何找出哪个索引被有效查询次数最多?

例如,考虑一个数组[3,4,5,6,7,9]

和查询

0 3
3 5
1 2
2 4

Output
Index 0 has been queried 1 time.
Index 1 has been queried 2 times.
Index 2 has been queried 3 times.
Index 3 has been queried 3 times.
Index 4 has been queried 2 times.
Index 5 has been queried 1 time.

我怎样才能让它尽可能快?

最佳答案

您可以在 O(n+q) 中执行此操作,其中 n 是数组的大小,q 是查询的数量:

  1. 用 n 个条目创建空数组 A
  2. 对于每个查询 i,j 将 A[i] 增加 1,并将 A[j+1] 减少 1
  3. 遍历数组计算累计总数并跟踪累计总数最高的索引

对于我们看到开始的每个间隔,累积总数将包含 +1,对于我们看到结束的每个间隔,累积总数将包含 -1。这意味着总数将给出当前打开间隔的计数,或者换句话说,该条目被查询的次数。

关于algorithm - 给定一个数组,以及对索引 `i j` 的一系列查询,我如何有效地找出哪个索引被查询的次数最多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22041700/

相关文章:

c++ - 如何在 SPOJ Feynman 中应用动态规划?

java - 按值从高到低对 Hashmap 进行排序

algorithm - 如何在二叉搜索树中找到与给定键值最接近的元素?

java - 优化二维数组中的删除节点

algorithm - 图吞吐量算法

python - 制作字典的内存效率更高的方法?

algorithm - 使用 FLOOR 求解给定算法的递归方程

c# - 如何提高数据 GridView 中的搜索速度

algorithm - 计算 "Busy hour"

java - 不使用数据库存储表数据的最佳方法?