1) Existe um algoritmo melhor que o ingênuo O (| E |. | V |) para calcular o número de descendentes de cada vértice em um DAG?
2) Existe um algoritmo online para fazê-lo, assumindo que os nós sejam adicionados um por um e se conectem a um subconjunto não vazio dos nós existentes?
Contexto: Estou interessado no caso em que m = O (n), milhões de vértices, dezenas de milhões de arestas normalmente. Como alternativa, seria útil contar o número de descendentes que também são sumidouros.
Uma abordagem probabilística seria o hash min, como uma maneira de representar o conjunto de descendentes de cada nó. A união da estrutura min-hash é trivial e a cardinalidade da união pode ser estimada a partir do número de coincidências nos min-hashes.
No entanto, não tenho certeza de quão bem comportado isso seria ao propagar o DAG, intuitivamente, parece que os erros seriam compostos rapidamente.
Muito relacionado: /cstheory/553/what-bounds-can-be-put-on-counting-reachable-nodes-in-a-dag E, na verdade, uma duplicata de: https: // cstheory.stackexchange.com/questions/18787/what-is-the-fastest-deterministic-algorithm-for-incremental-dag-reachability
fonte
Respostas:
N
, definaN.QueryCount = 0
.N
, em ordem topológica reversa:N.Descendants = {N} U {C.Descendants | C in N.Children}
.(N, N.Descendants.Count)
do algoritmo.N.Parents
estiver vazio, você pode descartarN.Descendants
.C
noN.Children
, incrementoC.QueryCount
. SeC.QueryCount == C.Parents.Count
, você pode descartarC.Descendants
.É claro que isso é caro se os graus dos nós forem grandes. A complexidade do pior caso pode não ser significativamente melhor que o seu "algoritmo ingênuo" não especificado.
A questão é que esse é um problema muito difícil de resolver. Suponha que exista um DAG com milhões de nós, milhões de arestas, etc. Eu mostro a você esta parte do gráfico:
Quantos descendentes
A
tem? O número de descendentes deB
mais o número de descendentes deC
menos o número de descendentes comuns deB
eC
. É o terceiro termo que cria a dificuldade. Você não pode saber apenas o número de descendentes deB
eC
- também precisa saber quais são os descendentes.fonte
Descendants
conjuntos terão tamanho O (n) próximo ao final.A listagem de todos os descendentes de todos os vértices pode produzir uma saída do tamanho
O(n²)
, por exemplo, se o gráfico for um gráfico linear, o vértice sem aresta de entrada terán - 1
descendentes, o vértice a seguirn - 2
e assim por diante.Isso deixa a questão se você pode determinar o número de descendentes sem enumerá-los. Não posso provar, mas estou bastante confiante de que a resposta é não. Suponha um vértice
x
tem filhosu
ev
, em seguida, você tem que encontrar a cardinalidade da intersecção dos conjuntos de descendentes deu
ev
mas não há simplesmente nada que você conheça sobre esse conjunto -u
ev
não podem compartilhar um único descendente ou eles podem ter o mesmo conjunto de descendentes .fonte