¿Cómo contar el número de todos los tipos topológicos en un DAG dado? ¿Puedes dar algún ejemplo en este gráfico?

Según esta respuesta de StackExchange de Henning Makholm, este es un problema difícil.

¿Cuántos ordenamientos topológicos existen para un gráfico?

La forma principal es ser sistemático sobre su conteo.

Si lo piensa, puede determinarlo en algunos casos para acelerar su conteo.

Aquí hay uno. Supongamos que el DAG es un bosque de caminos. Entonces el número total de ordenamientos topológicos es

[matemáticas] \ frac {\ left (\ sum V_i \ right)!} {\ prod (V_i!)} [/ math]

Prueba: asigne un número a cada ruta, [math] i [/ math]. Es fácil ver que una disposición de [math] \ sum V_i [/ ​​math] con [math] V_i [/ ​​math] siendo [math] i [/ math] s correspondería fácilmente a un orden topológico, cada cada vez que veas [math] i [/ math], toma el siguiente vértice disponible en el camino.

Ahora, podemos hacer un seguimiento recursivo, visitando todos los ordenamientos topológicos en orden lexicográfico. 4 y 5 son los únicos primeros vértices posibles en el orden topológico.

4 4
45
En este punto, nos quedan las rutas 0 y 231, que tienen 4 formas diferentes de organizar, usando la fórmula anterior. Son 450231, 452031, 452301, 452310.
Ningún otro vértice puede seguir después de 4, excepto 5.
5 5
52
523
5231
52314
523140 (5)
523401 (6)
523410 (7)
524: Tenemos los dos caminos 31 y 0, haciendo 3 formas. Tenemos 10 formas hasta ahora.
54: Igual que 45, 4 casos más.

En total, tenemos 14 ordenamientos topológicos.

Desafortunadamente, no encontrará una forma eficiente de hacer esto en general. El problema de contar el número de tipos topológicos en un DAG es # P-completo (Contando extensiones lineales es # P-completo).

Esto es aún más difícil que NP-complete: es equivalente a contar el número de soluciones para una fórmula booleana, en lugar de solo determinar si hay una solución.

Pero si está dispuesto a pasar un tiempo exponencial en el peor de los casos, puede escribir un algoritmo de retroceso recursivo simple que encuentre todos los tipos topológicos posibles.

No he estudiado el problema en detalle, por lo que también puede haber algoritmos más eficientes.

More Interesting

¿Qué es un algoritmo para convertir de una matriz de adyacencia a listas de adyacencia?

¿Cómo sabe la CPU que estamos usando el complemento de uno o el complemento de dos para representar números negativos?

¿Cuántos dígitos de precisión pueden medir los experimentos físicos (PI)?

¿Cuáles son las fórmulas matemáticas para expresiones informáticas como: x = x / 5?

¿Cuáles son las diferencias entre autómatas finitos y sistema de transición?

¿Cuál es el significado del lema de aislamiento?

¿Cómo se calcula la probabilidad de un modelo de regresión de cresta?

Me encanta aprender teoría, pero no siempre disfruto escribiendo código. ¿Cómo me pueden pagar para vivir en el mundo de los pensamientos? ¿Solo estoy siendo vago?

¿Cuál es la forma más sencilla de entender las máquinas de Turing y el problema del castor ocupado?

Dado un conjunto de datos sin clasificar de tamaño n, si usa la selección de clasificación para ordenar los datos, ¿cuántas búsquedas binarias necesitaría realizar en el conjunto de datos sin clasificar para "recomprar" el costo que conlleva la clasificación de sus datos si n = (2 ^ 4)?

¿Para qué sirve la función explotar ()?

¿Cuál es tu fórmula matemática discreta favorita?

¿Qué tan importante es el modelado matemático para los científicos de datos?

¿Cuál es la diferencia real entre las aperturas f / 1.8 yf / 2.2 en las lentes de la cámara?

Cómo verificar si un BigInteger es un cuadrado perfecto en C #