Definir estrutura de dados para inserções repetidas eficientes


11

Estou procurando por uma estrutura de dados com espaço eficiente que armazene conjuntos (sem repetição) de elementos de tamanho de palavras e suporte a inserção rápida (O (1) amortizado). Por "espaço eficiente", quero dizer, idealmente, palavras para armazenar n elementos.n+o(n)n

Ser um conjunto é uma parte importante da questão: se cada elemento for adicionado vezes o espaço usado não poderá ser n log n .lognnlogn

A estrutura também deve apoiar a listagem de seus elementos (razoavelmente eficiente); qualquer estrutura sã não deve ter problemas aqui. (Consultas rápidas sobre associação são uma vantagem.)


2
Existe uma razão para que uma tabela de hash não funcione?
Dave

@ Dave: Eu não acho que isso atenda aos requisitos de espaço, mas suponho que um cronograma de redimensionamento dinâmico suficientemente estrito possa fazê-lo funcionar. Mas geralmente eu gostaria de ver o que há por aí antes de realmente escrever o código.
Charles

1
Para obter amortizado com redimensionamento dinâmico, é necessário aumentar o tamanho em uma fração constante, o que não acho que atenda ao requisito de espaço se você quiser atender estritamente n + o ( n ) . O(1)n+o(n)
Dave

O(1)

@ Magnus: Eu acho que isso significa que as funções reais por trás das notações O e O da questão não dependem do tamanho da palavra.
Tsuyoshi Ito

Respostas:


10

Acho que os "Dicionários e árvores dinâmicos sucintos de Raman e Rao " atendem aos limites especificados por você. Do resumo:

SU={0,,m1},|S|=nO(1)SO(1)B+o(B)B=lg(mn)é o espaço mínimo informação teórica para representar .S


Isso parece fantástico. (Você vai entender se eu ler o jornal antes de aceitar, embora, né?)
Charles

1

Se o seu aplicativo puder tolerar alguns falsos positivos, você deve usar um filtro Bloom .

Paráfrase da Wikipedia: Um filtro Bloom é uma estrutura de dados probabilística com eficiência de espaço usada para testar se um elemento é membro de um conjunto. Falsos positivos são possíveis, mas falsos negativos não são. Os elementos podem ser adicionados ao conjunto, mas não removidos. Quanto mais elementos forem adicionados ao conjunto, maior a probabilidade de falsos positivos.


O meu não pode, mas +1 para uma ótima estrutura de dados.
Charles
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.