Dada uma família conjunto de subconjuntos de um universo . Deixe e queremos responder é .
Estou procurando uma estrutura de dados que me permita responder rapidamente a isso. Minha aplicação é da teoria dos grafos, onde eu quero ver se a exclusão de um vértice e sua vizinhança deixa algum vértice isolado e, para cada vértice, lista todos os vértices isolados que ele deixa.
Eu quero criar o poset completo ou, eventualmente, uma tabela armazenando true false false exatamente quais conjuntos são subconjuntos um do outro.
Seja,e, suponha
Podemos gerar a matriz de contenção (o gráfico bipartido) em tempo e, em seguida, criar a tabela de todas as comparações em tempo para cada conjunto , percorrer todos os elementos de todos os outros conjuntos e marcar o conjunto como não um subconjunto de se que o elemento não é em . No tempo total de .
Podemos fazer algo mais rápido? Em particular, o tempo possível ou não?
Encontrei alguns artigos relacionados:
Algoritmo Sub-Quadrático Simples para Computar a Ordem Parcial do Subconjunto (1995) que fornece um algoritmo .
A Ordem Parcial do Subconjunto: Computação e Combinatória melhora um pouco o exposto acima, mas também afirma que o artigo acima resolve o problema no tempo que é o número máximo de conjuntos que compartilham um elemento comum, mas não consegui entender esse resultado.d
No artigo Entre eO ( n α ) os autores mostram como, em um gráfico, encontrar os componentes conectados após excluir a vizinhança fechada de um vértice usando multiplicação de matrizes. Isso pode ser usado para calcular o poset de inclusão de conjunto localizando todos os componentes que são singletons com um tempo de execução de .
Também esta discussão no fórum está relacionada: Qual é a maneira mais rápida de verificar a inclusão de conjuntos? o que implica um limite inferior de .
fonte
Respostas:
Se a aleatoriedade estiver dentro dos limites, uma idéia aproximada seria gerar várias funções de "assinatura monotônica aleatória" e usá-las para aproximar a relação do subconjunto (a la Bloom filtra). Infelizmente, não sei como transformar isso em um algoritmo prático, mas aqui estão algumas estimativas que não provam imediatamente a idéia impossível. Isso está muito longe de ser uma solução útil, mas vou escrevê-la caso isso ajude.
Suponha, por simplicidade, que os conjuntos tenham quase o mesmo tamanho, digamos , e esse . Podemos assumir , caso contrário, terminamos. Definir Observe que .s = o ( u ) 1 ≪ s q| S| =s±O(1) s = o ( u ) 1 ≪ s p≫1
Aqui está a parte impraticável. Escolha aleatoriamente subconjuntos com substituição, cada um do tamanho , e defina uma função por se para alguns . Com fixo e variando aleatoriamente, temos Como é monotônico, implicap UMA1, … , Ap⊂ U q f: 2você→ { 0 , 1 } f( S) = 1 UMAEu⊂ S Eu S UMAEu, f f(S)S⊂Tf(S)≤f(T)T⊄St∈T-SfT⊄S Pr ( f ( S ) = 0 < 1 = f ( T ) )
Mesmo se os cálculos acima estiverem corretos, não faço ideia de como gerar rapidamente funções de assinatura monotônica com os recursos desejados. Também é provável que essa técnica não se estenda a tamanhos de conjuntos significativamente diferentes.
fonte