转自:http://apps.hi.baidu.com/share/detail/33202817
下面放出总结的表:
算法 | 处理方式 | 复杂度 | 备注 |
转化算法 | |||
LCA =>±1RMQ | N/A | O(n) | 引理1,规模O(n) – O(2n-1) |
RMQ => LCA-CT | N/A | O(n) | 引理2,规模不变 |
朴素算法 | |||
LCA-Naive | online | O(n^2)-O(1) | 动态规划 |
RMQ-Naive | online | O(n^2)-O(1) | 直接求解 |
经典算法 | |||
LCA-Tarjan | offline | O(na(n)) | |
RMQ-ST | online | O(nlogn)-O(1) | |
改进算法 | |||
RMQ-ST-Block | online | O(nloglogn)-O(1) | 将RMQ-ST分段处理 |
±1RMQ-ST-Block | online | O(n)-O(1) | 控制RMQ-ST-Block中分段的段种数,得到O(n)算法。 |
快速算法 | |||
RMQ-Fast | online | O(n)-O(1) | RMQ => LCA-CT => ±1RMQ |
折衷算法 | |||
RMQ-IT | online | O(n)-O(logn) | 线段树直接处理 |
RMQ-CT-Tarjan | offline | O(na(n)) | RMQ => LCA-CT 再用LCA-Tarjan解决。 |
我们可以将一般RMQ的值得应用的算法列表:
算法 | 处理方式 | 复杂度 | 备注 |
RMQ-IT | online | O(n)-O(logn) | 询问不多时,竞赛首选。 |
RMQ-CT-Tarjan | offline | O(na(n)) | 由于是离线的,而且还要转化成CT,某些地方不应用。 |
RMQ-ST | online | O(nlogn)-O(1) | 询问多时,竞赛首选。 |
RMQ-ST-Block | online | O(nloglogn)-O(1) | 时间要求特别严格时采用。 |