标题:学习RMQ的sparse table算法 出处:Felix021 时间:Sun, 03 Aug 2008 20:22:55 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1066 内容: 此版本的代码可能有问题,查看新版本。 以为会很难,看了一下,居然很容易就看懂了,也自己把代码写出来了(但愿没有错。。)。 RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够。可以用线段树将算法优化到O(logn)(在线段树中保存线段的最值)。不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实现O(1)的查询效率。下面把Sparse Table算法分成预处理和查询两部分来说明(以求最小值为例)。 预处理: 预处理使用DP的思想,f(i, j)表示[i, i+2^j - 1]区间中的最小值,我们可以开辟一个数组专门来保存f(i, j)的值。 例如,f(0, 0)表示[0,0]之间的最小值,就是num[0], f(0, 2)表示[0, 3]之间的最小值, f(2, 4)表示[2, 17]之间的最小值 注意, 因为f(i, j)可以由f(i, j - 1)和f(i+2^(j-1), j-1)导出, 而递推的初值(所有的f(i, 0) = i)都是已知的 所以我们可以采用自底向上的算法递推地给出所有符合条件的f(i, j)的值。 查询: 假设要查询从m到n这一段的最小值, 那么我们先求出一个最大的k, 使得k满足2^k Generated by Bo-blog 2.1.0