Considere o seguinte problema:
Deixei seja uma constante. Nos é dado ummatriz -ary do e 's. Deixei.
Queremos criar uma estrutura de dados pré-processando para executar o seguinte tipo de operações de consulta:
- Dadas as coordenadas de um caixa de ary , Tem alguma na caixa?
- Dadas as coordenadas de um caixa de ary , retorne a posição de um na caixa (se houver).
As operações devem ser executadas em tempo constante . A complexidade do tempo é medida em uma máquina de RAM. O tempo e o espaço de pré-processamento para a estrutura de dados não são importantes para nós.
A questão é quanto espaço (em complexidade de bits) precisamos armazenar uma estrutura de dados que permita as operações acima?
O limite inferior trivial é bits, já que o array pode ser reconstruído para essas consultas (portanto, a estrutura de dados deve ter pelo menos a mesma quantidade de informações).
O limite superior trivial é armazenar a resposta para todas as consultas. Isso precisaria de bits. No entanto, suspeitamos que isso possa ser feito com muito mais eficiência.
Por exemplo, considere o caso especial em que . Nesse caso, podemos usar uma estrutura de dados RMQ sucinta para resolver o primeiro problema, e a estrutura de dados leva bits para armazenar.
O que é uma estrutura de dados eficiente para esta tarefa?
Quão baixa a complexidade do espaço (o número de bits) pode suportar essas operações (ou apenas a primeira operação)?
Atualização (1/15): No caso especial , usar bits é suficiente (na verdade é melhor, , onde é o número está em ) reduzindo o problema para um problema anterior e usando a redução do problema anterior para o dicionário totalmente indexável (FID). Veja " Mais pressa, menos desperdício: diminuindo a redundância em dicionários totalmente indexáveis " de Grossi, Orlandi, Raman e Rao (2009).
Atualização (27/6): Reduza novamente o problema para RMQ. Usamos um RMQ dimensional de Yuan e Atallah para obter um limite superior de à quantidade de espaço necessário quando é corrigido.
Respostas:
Você pode economizar muito mais memória se apenas permitir a complexidade do tempo logarítmico. Você pode implementar uma árvore de segmentos kD que precisará de memória N * 2 ^ k bits e é executada com complexidade de tempo logarítmica para ambas as subtarefas e complexidade linear de tempo para a construção da árvore.
Se você deseja estritamente O (1), precompute tudo.
fonte