Armazenando um vetor de bits na memória não inicializada e espaço mínimo

8

Um truque conhecido para armazenar vetores de bits usando memória não inicializada pode alocar um vetor de bits de tamanho no qual todos os bits são definidos como , alocando bits de memória e inicializando apenas deles. Essa representação suporta a configuração e a desabilitação de qualquer bit em tempo constante.n0 0(2n+1)lgnlgn

Isso remonta a "O livro de 1974 de Alfred Aho, John Hopcroft e Jeffrey Ullman, The Design and Analysis of Computer Algorithms ... Capítulo 2, exercício 2.12", "O livro de Jon Bentley, 1986, Programming Pearls ... .Coluna 1, exercício 8; exercício 9 na segunda edição "e " artigo de Preston Briggs e Linda Torczon de 1993, 'Uma representação eficiente para conjuntos esparsos' " .

"Mudando a base sem perder espaço", de Dodis et al., um pouco o requisito de espaço para bits, embora esse algoritmo exija a pré-computação de constantes com bits cada.(2n+1)lgn+1Θ(lgn)Θ(lgn)

Quanto espaço pode ser economizado? Existe uma representação de vetores de bits em que

  • Os bits pode ser activado ou desactivado em horaO(1)
  • A inicialização de um novo vetor de bits de s usa bits de memória não inicializada e memória inicializada0 0o(nlgn)O(lgn)
jbapple
fonte

Respostas:

2

Sim, isso pode ser feito através do balde . A representação em Briggs e Torczon pode ser usada para armazenar não apenas bits, mas valores associados a qualquer conjunto de bits, armazenando-os próximos aos valores na matriz densa. Para valores de bits , isso leva a um custo total de armazenamento de .k(2n+1)lgn+kn

Agora escolha . Cada valor bit irá representar um conjunto de bits contíguos na matriz de bits. Portanto, precisamos apenas rastrear deles com as matrizes densas e esparsas. Isso leva a um custo total de bits de armazenamento, com bits inicializados.lg n n /lg n Θ ( n ) Θ ( lg n )k=lgnklgnn/lgnΘ(n)Θ(lgn)

Como a solução básica, isso requer operações com palavras de comprimento para definir um único bit.Θ ( lg n )O(1)Θ(lgn)

jbapple
fonte