Dado um array de números naturais , onde é uma constante, eu quero responder em O (1) consultas da forma: "quantas vezes é que m aparecer na matriz entre os índices i e j "?
A matriz deve ser pré-processada em tempo linear. Em particular, gostaria de saber se há uma redução no intervalo de consulta mínima.
Isso é equivalente a RMQ no caso em que e você deseja consultar o número de unidades em um intervalo. Para que possamos usá- lo .
Não pude responder minha própria pergunta por causa dos limites da SE.
Respostas:
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.k 0 m 0 ≤ m < n 0 .. n O ( n k ) = O ( n ) O ( n k ) i , j
count[pos][elem] = occurences of 'elem' in the indices 0..pos
Pré-processando
Inquerir
(assume que i, j são ambos limites inclusivos)
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 .k O ( logn ) O ( logn )
count
Desculpas por quaisquer problemas com esta resposta, é o meu primeiro.
fonte