|
1
0
除了前面的答案外,这里还有一个如何准备范围以优化后续查找的建议。这个想法归根结底是对所有显著不同的输入值预先计算结果,但是在值没有显著差异的情况下要聪明。 为了说明我的意思,让我们考虑一下这个范围序列:
准备好的输出结构如下:
对于范围内的任何数字
请注意,最后一个范围没有一个后续范围,因此显式零成为必需的。对于第一个值之前的值,这是隐含的。要查找值的结果,只需查找小于或等于该值的键。这是一个简单的O(log n)查找。 |
|
2
0
首先,如果您只是对这些对进行了一次简单的扫描,您将拥有O(N)复杂性!O(n log n)来自排序,对于一次性操作,这只是开销。这甚至可能是最好的方法,如果不重用结果,即使只执行一些查询,也可能比排序更好。确保您允许自己关闭算法。 无论如何,让我们考虑一下您需要进行许多查询。然后,改进事情的一个相对明显的步骤是在排序之后不要一步一步地重复。相反,您可以对下限进行二进制搜索。简单地把序列分成两半。下限可以在任意一半中找到,您可以通过查看分区之间的中间元素来确定。重复,直到找到第一个不可能包含搜索值的元素,因为它的起始值已经较大。 关于另一个方向,事情并不那么容易。仅仅因为按起始值对范围进行了排序,并不意味着也对结束值进行了排序。同样,匹配的范围和不匹配的范围可以在序列中混合,所以这里您必须执行线性扫描。 最后,一些注意事项:
|
|
|
3
0
对于段树、二叉索引树、间隔树来说,这是一个非常典型的样式问题。
您必须对数组执行两个操作
在一个数组上有两个操作
或者,你可以稍微巧妙地阐述你的问题。
在上面的每种情况下,您都有一个O(N)操作和一个O(1)操作。 对于第二种情况,查询本质上是前缀和计算。二叉索引树在这项任务中特别有效。 Tutorial for Binary Indexed Trees 重要思想:阵列压缩
你提到过矢量大小
超级聪明的想法:莫氏算法
只有允许您脱机解决问题时才允许这样做。这意味着可以获取所有查询点
如果这是你的情况,请说明,只有这样我才能进一步阐述。但是二叉索引树将比mo的算法更有效。 编辑:
因为间隔值的类型是
这里所有感兴趣的点并不是所有可能的加倍,而是上面的数字。
如果我们把它们映射成正整数:
然后可以使用段树/二元索引树。 |
|
|
4
-1
对于每对a,b可以分解,使a=+1和b=-1表示对特定值有效的范围数。然后in变成一个简单的o(log n)查找,以查看包含搜索值的范围有多少。 |
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 2 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 2 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 2 年前 |