Dado un dag ponderado, ¿existe un algoritmo O (V + E) para reemplazar cada peso con la suma de sus pesos ancestrales?

34

El problema, por supuesto, es contar dos veces. Es bastante fácil de hacer para ciertas clases de DAG = un árbol, o incluso un árbol serie-paralelo. El único algoritmo que he encontrado que funciona en DAG generales en un tiempo razonable es aproximado (difusión de sinopsis), pero aumentar su precisión es exponencial en el número de bits (y necesito muchos bits).

Antecedentes: esta tarea se realiza (varias veces con diferentes 'pesos') como parte de los cálculos de probabilidad en BBChop (http://github.com/ealdwulf/bbchop), un programa para encontrar errores intermitentes (es decir, una versión bayesiana de ' git bisect '). El DAG en cuestión es, por lo tanto, un historial de revisión. Eso significa que es poco probable que el número de aristas se acerque al cuadrado del número de nodos, es probable que sea menor que k veces el número de nodos para algunos k pequeños. Lamentablemente, no he encontrado ninguna otra propiedad útil de los DAG de revisión. Por ejemplo, esperaba que el componente triconectado más grande creciera solo como la raíz cuadrada del número de nodos, pero lamentablemente (al menos en la historia del kernel de Linux) crece linealmente.

Ealdwulf
fuente
Solo para aclarar: ¿son solo los nodos los que tienen pesos, no los bordes?
Heinrich Apfelmus
Sí, solo los nodos.
Ealdwulf
44
Esto parece ser casi un duplicado de cstheory.stackexchange.com/questions/553/… ?
Jukka Suomela
esto en realidad parece más general, ya que asignar pesos unitarios a todos los vértices reduce este problema al problema de la accesibilidad.
Suresh Venkat
La aproximación parece no ser difícil de hacer con algunos factores adicionales de polylog ...
Sariel Har-Peled

Respuestas:

17

Suponemos que los pesos de vértice pueden ser enteros positivos arbitrarios, o más precisamente, pueden ser enteros positivos como máximo 2 n . Entonces, la tarea actual no se puede realizar incluso en un límite de tiempo ligeramente más débil O ( n 2 ), a menos que el cierre transitivo de un gráfico dirigido arbitrario se pueda calcular en tiempo O ( n 2 ), donde n denota el número de vértices. (Tenga en cuenta que un algoritmo de tiempo O ( n 2 ) para el cierre transitivo será un gran avance). Este es el contrapositivo de la siguiente afirmación:

Reclamo . Si la tarea actual se puede realizar en el tiempo O ( n 2 ), el cierre transitivo de un gráfico dirigido arbitrario dado como su matriz de adyacencia se puede calcular en el tiempo O ( n 2 ) (suponiendo algún modelo computacional razonable).

Prueba . Como preprocesamiento, calculamos la descomposición de componentes fuertemente conectados del gráfico dirigido G dado en el tiempo O ( n 2 ) para obtener un DAG G '. Tenga en cuenta que si podemos calcular el cierre transitivo de G ', podemos reconstruir el cierre transitivo de G' .

Ahora asigne el peso 2 i a cada vértice i del DAG G 'y use el algoritmo para el problema actual. Luego, la representación binaria de la suma asignada a cada vértice i describe exactamente el conjunto de antepasados ​​de i , en otras palabras, hemos calculado el cierre transitivo de G '. QED .

Lo contrario de la afirmación también es válida: si puede calcular el cierre transitivo de un DAG dado, es fácil calcular las sumas requeridas por trabajo adicional en el tiempo O ( n 2 ). Por lo tanto, en teoría, puede lograr la tarea actual en el tiempo O ( n 2.376 ) utilizando el algoritmo para el cierre transitivo basado en el algoritmo de multiplicación de matriz de Coppersmith-Winograd .

Editar : la Revisión 2 y anteriores no establecían la suposición acerca del rango de pesos de vértices explícitamente. Per Vognsen señaló en un comentario que esta suposición implícita puede no ser razonable (¡gracias!), Y estoy de acuerdo. Incluso si no se necesitan pesos arbitrarios en las aplicaciones, supongo que esta respuesta podría descartar algunos enfoques mediante la siguiente línea de razonamiento: “Si este enfoque funcionara, daría un algoritmo para los pesos arbitrarios, que se descarta a menos que sea transitivo el cierre se puede calcular en el tiempo O ( n 2 ) ".

Editar : la revisión 4 y anteriores indicaron incorrectamente la dirección de los bordes.

Tsuyoshi Ito
fuente
44
Anoche estuve pensando en esto mismo, ya que una solución práctica utiliza vectores de bits para hacer el recuento de exclusión. Supongo que la única pregunta es si es razonable suponer que los pesos pueden tener una longitud de bits proporcional a n. En la práctica, me imagino que los pesos están limitados por alguna k, de modo que la suma máxima posible es kn, que no es suficiente para hacer este truco.
Según Vognsen el
@Per: estoy de acuerdo en que la suposición de que los pesos de vértice pueden ser enteros de n bits podría ser cuestionable. Edité la respuesta para hacer explícita esta suposición. ¡Gracias!
Tsuyoshi Ito
1
@Per: me di cuenta de que si los pesos de los vértices son enteros delimitados por O (1), el problema se reduce al caso en que todos los vértices tienen el peso 1 al duplicar los vértices de una manera adecuada.
Tsuyoshi Ito
Lamentablemente, no veo una respuesta en ese hilo al problema de conteo. Los recuentos contienen logarítmicamente menos información que la lista del cierre transitivo, O (n log n) frente a O (n ^ 2), por lo que no veo cómo podría funcionar una reducción directa.
Según Vognsen el
Por cierto, una versión interesante de este problema es cuando tenemos un límite en el factor de ramificación e información sobre el crecimiento en tamaño de las generaciones (a la topología) del DAG. Si el crecimiento es exponencial, el patrón es esencialmente en forma de árbol. ¿Qué pasa si es lineal, log-lineal, cuadrático, etc.?
Según Vognsen el
2

Esta es una expansión de mi comentario sobre la respuesta de Tsuyoshi. Creo que la respuesta negativa a la pregunta puede hacerse incondicional.

Este problema parece requerir operaciones de suma en el peor de los casos, incluso para gráficos con bordes O ( n ) . Por lo tanto, no parece posible alcanzar el límite requerido.ω(norte)O(norte)

Considere un gráfico consiste en vértices r × c , dispuestos en una cuadrícula. Los vértices en cada una de las filas r dependen precisamente de dos vértices en la fila de arriba. La familia consta de gráficos como este, para combinaciones adecuadas de valores de r y c , y disposiciones adecuadas de bordes.solr,dor×dorrdo

En particular, dejar que y c = 2 n / log n . Además, deje que los pesos de los vértices de la fila superior sean potencias distintas de 2.r=(Iniciar sesión norte)/ /2do=2norte/ /Iniciar sesión norte

Cada uno de los vértices en la fila inferior dependerá de vértices en la fila superior. Por lo que yo puedo decir, hay entonces existe un DAG específica con diferentes valores para cada uno de los pesos de fila inferior, de manera queω(logn)se requieren adiciones no reutilizables en promedio para cada una de estas sumas.norteω(Iniciar sesión norte)

ω(norte)2do(r-1)=O(norte)

El punto parece ser que el orden parcial subyacente es denso, pero el DAG representa su reducción transitiva, que puede ser escasa.

András Salamon
fuente
Este argumento es interesante, pero no estoy seguro de si puede convertirse en una prueba de alguna declaración interesante. Teniendo en cuenta la dificultad generalizada de probar los límites inferiores de los problemas, este argumento me parece práctico.
Tsuyoshi Ito
@ Tsuyoshi: Creo que la existencia debería funcionar a través de un argumento probabilístico, y el límite inferior es débil, por lo que parece haber suficiente espacio para que funcione. Pero tiene razón, es fácil de manejar, esa frase "adiciones no reutilizables en promedio" necesita una mejor base.
András Salamon
-2

Esto está mal y se basa en un malentendido sobre la pregunta. Gracias a Tsuyoshi por señalar pacientemente mi error. Dejar en caso de que otros cometan el mismo error.

k

kO(kEl |VEl |)

O(El |VEl |+El |miEl |)

Este enfoque también debería funcionar bien si hay algunos nodos con muchos predecesores inmediatos, siempre que sean relativamente poco frecuentes.

András Salamon
fuente
44
No lo entiendo. ¿Cómo se evita el doble conteo cuando el DAG no es un árbol? De hecho, si no me equivoco, el caso general se puede reducir al caso en que cada vértice tiene como máximo dos predecesores, y cualquier algoritmo de tiempo lineal para el último caso proporciona un algoritmo de tiempo de línea para el caso general.
Tsuyoshi Ito
El límite solicitado fue O(El |VEl |+El |miEl |)k
Me temo que entendiste mal mi comentario. Estoy cuestionando la exactitud de su algoritmo, no el tiempo de ejecución. Suponga que un DAG con cuatro vértices A, B, C, D con bordes A → B → D y A → C → D con cada vértice dado algo de peso. Después de calcular las sumas parciales para B y C, no puede simplemente sumar las sumas parciales para B y C para calcular la suma de D porque hacerlo sumaría el peso del vértice A dos veces.
Tsuyoshi Ito
tu<vw(tu)
1
Sí. Y ahora recuerdo que la primera vez que vi esta pregunta, leí mal la pregunta de la misma manera y pensé que sería obvio. Pero no, la verdadera pregunta es más difícil que eso. Tiempo de pensar….
Tsuyoshi Ito