Range Minimum Query (Square Root Decomposition and Sparse Table)

https://www.geeksforgeeks.org/range-minimum-query-for-static-array/

spare table is 2D k*i k = floor(log size)

lookuptable 就是I起点 走2^k步,就是1,2,4,8 ....初始化这个表,表里存min的index

query时候就是lookup【l,k】对比lookup[r-2^k, k] 这俩range有重叠。 哪个range的min小返回哪个

space o(n logn) time o(1)

square root

分成√n block 每段里有√n个元素。每次就是中间block和头尾2个edge block算

space time o(√n)

spare table

import math


class Query:
    def __init__(self):
        self.f = None


    def preprocess(self,arr):
        n = len(arr)
        k = int(math.floor(math.log(n,2)))
        f = [[0]*k for _ in range(n)]
        for i in range(n):
            f[i][0] = i
        i,j=0,1
        while (1<<j) <=n:
            while i+ (1<<j) - 1< n:
                f[i][j] = f[i][j - 1] if arr[f[i][j-1]] < arr[f[i+(1<<(j-1))][j-1]] else f[i+(1<<(j-1))][j-1]
                i+=1
            j+=1
        self.f = f

    def query(self,arr, l,r):
        k = int(math.floor(math.log(r-l+1,2)))
        return arr[self.f[l][k]] if arr[self.f[l][k]] <= arr[self.f[r- (1<<k) +1][k]] else arr[self.f[r- (1<<k) +1][k]]


    def RMQ(self,arr, queries):
        self.preprocess(arr)
        for q in queries:
            print(self.query(arr,q[0],q[1]))

Last updated