Precisa de uma boa visão geral dos algoritmos sucintos de estrutura de dados

14

(já solicitado no site principal , mas solicitando aqui também uma melhor cobertura, desculpe)

Desde que eu soube sobre estruturas de dados sucintas, estou precisando desesperadamente de uma boa visão geral dos desenvolvimentos mais recentes nessa área.

Pesquisei no Google e li muitos artigos que pude ver no topo dos resultados do Google sobre pedidos do topo da minha cabeça. Eu ainda suspeito que perdi algo importante aqui.

Aqui estão tópicos de particular interesse para mim:

  1. Codificação sucinta de árvores binárias com operações eficientes de obter pai, filho esquerdo / direito, número de elementos em uma subárvore.

    A principal questão aqui é a seguinte: todas as abordagens que conheço assumem os nós das árvores enumerados em ordem de respiração (como no trabalho pioneiro nessa área Jacobson, G. J. (1988). Estruturas de dados estáticas sucintas), que não parece apropriado para minha tarefa. Lido com grandes árvores binárias fornecidas no layout de profundidade primeiro e os índices de profundidade primeiro são chaves para outras propriedades do nó, portanto, alterar o layout da árvore tem algum custo para mim, que eu gostaria de minimizar. Daí o interesse em obter referências para trabalhos considerando outros layouts de árvores que não sejam BF.

  2. Matrizes grandes de itens de tamanho variável na memória externa. As matrizes são imutáveis: não preciso adicionar / excluir / editar os itens. O único requisito é o tempo de acesso ao elemento O (1) e o mais baixo custo possível, melhor do que a abordagem direta de deslocamento e tamanho. Aqui estão algumas estatísticas que reuni sobre dados típicos para minha tarefa:

    número típico de itens - centenas de milhões, até dezenas de bilhões;

    cerca de 30% dos itens têm comprimento não superior a 1 bit ;

    40% a 60% dos itens têm comprimento inferior a 8 bits;

    apenas poucas porcentagens de itens têm comprimento entre 32 e 255 bits (255 bits é o limite)

    comprimento médio do item ~ 4 bits +/- 1 bit.

    teoricamente, qualquer outra distribuição de comprimentos de itens é possível, mas todos os casos praticamente interessantes têm estatísticas próximas às descritas acima.

Links para artigos de qualquer complexidade, tutoriais de qualquer obscuridade, bibliotecas C / C ++ mais ou menos documentadas - qualquer coisa que seja útil para você em tarefas semelhantes ou o que parece ser o seu palpite - todas essas coisas são apreciadas com gratidão.

Atualização : esqueci de adicionar à pergunta 1: as árvores binárias com as quais estou lidando são imutáveis. Não tenho requisitos para alterá-los, tudo o que preciso é apenas percorrê-los de várias maneiras, sempre movendo-se do nó para os filhos ou para o pai, de modo que o custo médio dessas operações seja O (1).

Além disso, a árvore típica possui milhares de nós e não deve ser totalmente armazenada na RAM.

datjko
fonte

Respostas:

12

Suponho que você esteja interessado em estruturas sucintas de dados de memória externa que sejam eficientes na prática. Nesse caso, você provavelmente poderá obter o que deseja com algumas técnicas básicas e alguma engenharia.

Para as árvores, eu começaria lendo Arroyuelo et al .: Succinct Trees in Practice . O artigo trata de árvores na memória principal, mas a maioria das técnicas pode ser usada na memória externa com opções semelhantes às abaixo.

γδBB

nSnS[Eu]=1Eujrumank(j)

Se você deseja manter o índice de classificação pequeno, é necessário aumentar o tamanho do bloco (provavelmente kilobytes ou dezenas de kilobytes), tornando a solução básica acima intensiva em CPU. Isso pode ser resolvido adicionando um pouco de sobrecarga aos blocos armazenados no disco. Basicamente, você aplica a mesma solução recursivamente, para que cada bloco de disco armazene vários blocos pequenos e outro índice de classificação. Quando você recupera o bloco de disco correto, usa o índice de classificação dentro dele para encontrar o pequeno bloco certo para decodificar, em vez de decodificar o bloco inteiro. Com esse índice secundário, os acessos aleatórios provavelmente ficam vinculados à E / S, mesmo com as unidades de estado sólido mais rápidas disponíveis.

Jouni Sirén
fonte