Como é constante, podemos armazenar a contagem de cada elemento no intervalo para em em tempo e espaço. A observação principal é que você pode criar uma matriz bidimensional em tempo , em seguida, consultar intervalos encontrando a diferença nos índices em tempo constante.k0 m0 ≤ m < n0 .. nO ( n k ) = O ( n )count[pos][elem] = occurences of 'elem' in the indices 0..pos
O ( n k )i , j
Pré-processando
initialise count[pos][elem] to 0 for all elem, pos
for pos=0 to n
for num=0 to k
count[pos][num] = (0 if pos==0 else count[pos-1][num])
count[pos][arr[pos]] ++
Inquerir
(assume que i, j são ambos limites inclusivos)
if i == 0
return count[j][m]
else
return count[j][m] - count[i-1][m]
Se a matriz também estiver sendo atualizada durante o processo de consulta, você poderá usar as árvores Fenwick (índice binário) no lugar da matriz. Isso permite que você atualize em e consulte em .kcount
O ( logn )O ( logn )
Desculpas por quaisquer problemas com esta resposta, é o meu primeiro.