Dado um dag ponderado, existe um algoritmo O (V + E) para substituir cada peso pela soma de seus pesos ancestrais?

34

O problema, é claro, é a contagem dupla. É fácil o suficiente para certas classes de DAGs = uma árvore ou mesmo uma árvore serial-paralela. O único algoritmo que encontrei que funciona em DAGs gerais em tempo razoável é aproximado (difusão de sinopse), mas aumentar sua precisão é exponencial no número de bits (e eu preciso de muitos bits).

Histórico: esta tarefa é executada (várias vezes com pesos diferentes) como parte dos cálculos de probabilidade no BBChop (http://github.com/ealdwulf/bbchop), um programa para encontrar bugs intermitentes (por exemplo, uma versão bayesiana de ' git bisect '). O DAG em questão é, portanto, um histórico de revisões. Isso significa que é improvável que o número de arestas se aproxime do quadrado do número de nós; provavelmente será menor que k vezes o número de nós para algum k pequeno. Infelizmente, não encontrei outras propriedades úteis dos DAGs de revisão. Por exemplo, eu esperava que o maior componente triconnected crescesse apenas como raiz quadrada do número de nós, mas infelizmente (pelo menos na história do kernel do linux) cresce linearmente.

Ealdwulf
fonte
Só para esclarecer: são apenas os nós que têm pesos, não as arestas?
Heinrich Apfelmus
Sim, apenas os nós.
Ealdwulf
4
Isso parece ser uma quase duplicata de cstheory.stackexchange.com/questions/553/… ?
Jukka Suomela
na verdade, isso parece mais geral, pois a atribuição de pesos unitários a todos os vértices reduz esse problema ao problema de alcançabilidade.
Suresh Venkat
Aproximação não parece difícil de fazer com alguns fatores polylog extras ...
Sariel Har-Peled

Respostas:

17

Assumimos que os pesos dos vértices podem ser números inteiros positivos arbitrários ou, mais precisamente, eles podem ser números inteiros positivos no máximo 2 n . Então a tarefa atual não pode ser executada mesmo em um limite de tempo ligeiramente mais fraco O ( n 2 ), a menos que o fechamento transitivo de um gráfico direcionado arbitrário possa ser calculado em O ( n 2 ), em que n indica o número de vértices. (Observe que um algoritmo de tempo O ( n 2 ) para o fechamento transitivo será um avanço.) Esse é o contrapositivo da seguinte reivindicação:

Reivindicação . Se a tarefa atual puder ser executada no tempo O ( n 2 ), o fechamento transitivo de um gráfico direcionado arbitrário dado como sua matriz de adjacência pode ser calculado no tempo O ( n 2 ) (assumindo algum modelo computacional razoável).

Prova . Como pré-processamento, calculamos a decomposição de componentes fortemente conectados do gráfico direcionado G dado no tempo O ( n 2 ) para obter um DAG G '. Observe que, se pudermos calcular o fechamento transitivo de G ′, podemos reconstruir o fechamento transitivo de G ' .

Agora atribua o peso 2 i a cada vértice i do DAG G 'e use o algoritmo para o problema atual. Então a representação binária da soma atribuída a cada vértice i descreve exatamente o conjunto de ancestrais de i , ou seja, calculamos o fechamento transitivo de G ′. QED .

O inverso da reivindicação também é válido: se você pode calcular o fechamento transitivo de um determinado DAG, é fácil calcular as somas necessárias com trabalho adicional no tempo O ( n 2 ). Portanto, em teoria, você pode realizar a tarefa atual no tempo O ( n 2.376 ) usando o algoritmo para o fechamento transitivo baseado no algoritmo de multiplicação da matriz Coppersmith-Winograd .

Edit : A revisão 2 e anterior não declararam explicitamente a suposição sobre o intervalo de pesos dos vértices. Per Vognsen apontou em um comentário que essa suposição implícita pode não ser razoável (obrigado!), E eu concordo. Mesmo que pesos arbitrários não sejam necessários em aplicativos, acho que essa resposta pode descartar algumas abordagens pela seguinte linha de raciocínio: “Se essa abordagem funcionasse, daria um algoritmo para os pesos arbitrários, que é descartado, a menos que seja transitivo. o fechamento pode ser calculado no tempo O ( n 2 ). ”

Edit : A revisão 4 e anterior declararam a direção das arestas incorretamente.

Tsuyoshi Ito
fonte
4
Eu estava pensando sobre isso ontem à noite, uma vez que uma solução prática usa vetores de bits para fazer a contagem de exclusão. Eu acho que a única questão é se é razoável supor que os pesos possam ter comprimento de bits proporcional a n. Na prática, posso imaginar que os pesos sejam limitados por algum k, de modo que a soma máxima possível seja kn, o que não é suficiente para realizar esse truque.
Por Vognsen
@ Por: Concordo que a suposição de que os pesos dos vértices podem ser números inteiros de n bits pode ser questionável. Eu editei a resposta para tornar essa suposição explícita. Obrigado!
Tsuyoshi Ito
1
@ Per: eu percebi que se os pesos dos vértices são inteiros delimitados por O (1), o problema se reduz ao caso em que todos os vértices têm peso 1 , duplicando-os de maneira adequada.
Tsuyoshi Ito
Infelizmente, não vejo uma resposta nesse tópico para o problema de contagem. As contagens contêm logaritmicamente menos informações do que a listagem do fechamento transitivo, O (n log n) vs O (n ^ 2), portanto não vejo como uma redução direta poderia funcionar.
Por Vognsen
A propósito, uma versão interessante desse problema é quando temos um limite no fator de ramificação e informações sobre o crescimento em tamanho das gerações (à la topologia) do DAG. Se o crescimento é exponencial, o padrão é essencialmente semelhante a uma árvore. E se for linear, log-linear, quadrático, etc?
Por Vognsen
2

Esta é uma expansão do meu comentário sobre a resposta de Tsuyoshi. Penso que a resposta negativa à pergunta pode ser incondicional.

Esse problema parece exigir operações de adição na pior das hipóteses, mesmo para gráficos com arestas . Portanto, não parece possível atingir o limite necessário.O ( n )ω(n)O(n)

Considere um gráfico consiste em vértices, organizados em uma grade. Os vértices em cada uma das linhas dependem precisamente de dois vértices na linha acima. A família é composta por gráficos como este, por combinações adequadas de valores de e , e arranjos adequados de arestas. r × c r r cGr,cr×crrc

Em particular, deixa e . Além disso, permita que os pesos dos vértices da linha superior sejam potências distintas de 2.c = 2 n / log nr=(log n)/2c=2n/log n

Cada um dos vértices na linha inferior dependerá dos vértices na linha superior. Até onde sei, existe um DAG específico com valores diferentes para cada um dos pesos da linha inferior, de modo que adições não reutilizáveis ​​são necessárias, em média, para cada uma dessas somas. ω(logn)nω(log n)

No geral, isso gera um limite inferior para o número de adições, enquanto o número de arestas é .2 c ( r - 1 ) = O ( n )ω(n)2c(r1)=O(n)

O ponto parece ser que a ordem parcial subjacente é densa, mas o DAG representa sua redução transitiva, que pode ser esparsa.

András Salamon
fonte
Esse argumento é interessante, mas não tenho certeza se pode ser transformado em uma prova de qualquer afirmação interessante. Considerando a dificuldade generalizada de provar os limites mais baixos dos problemas, esse argumento parece-me ondulado.
Tsuyoshi Ito
@ Tsuyoshi: Eu acho que a existência deve funcionar através de um argumento probabilístico, e o limite inferior é fraco, então parece haver espaço suficiente para que ele funcione. Mas você está certo, é ondulado, que a frase "adições não reutilizáveis ​​em média" precisa de uma base melhor.
András Salamon
-2

Isso está errado e é baseado em um mal-entendido sobre a questão. Agradeço a Tsuyoshi por apontar pacientemente o meu erro. Sair no caso de outros cometerem o mesmo erro.

k

kO(k|V|)

O(|V|+|E|)

Essa abordagem também deve funcionar bem se houver alguns nós com muitos predecessores imediatos, desde que sejam relativamente pouco frequentes.

András Salamon
fonte
4
Eu não entendi. Como você evita a contagem dupla quando o DAG não é uma árvore? De fato, se não me engano, o caso geral pode ser reduzido ao caso em que cada vértice tem no máximo dois predecessores, e qualquer algoritmo de tempo linear para o último caso fornece um algoritmo de tempo de linha para o caso geral.
Tsuyoshi Ito
O(|V|+|E|)k
Receio que você tenha entendido mal o meu comentário. Estou questionando a correção do seu algoritmo, não o tempo de execução. Suponha que um DAG com quatro vértices A, B, C, D com arestas A → B → D e A → C → D com cada vértice tenha algum peso. Depois de calcular as somas parciais para B e C, você não pode simplesmente adicionar as somas parciais para B e C para calcular a soma de D, pois isso adicionaria o peso do vértice A duas vezes.
Tsuyoshi Ito
u<vw(u)
1
Sim. E agora lembro que, na primeira vez em que vi essa pergunta, a interpretei errado da mesma maneira e pensei que seria óbvio. Mas não, a verdadeira questão é mais difícil do que isso. Tempo para pensar….
Tsuyoshi Ito