Dejar ser un DAG Sabemos que algunos nodos en son "malos", mientras que otros son "buenos"; un descendiente de un nodo malo es malo mientras que los antepasados de un nodo bueno son buenos. También sabemos que los nodos defectuosos tienen un elemento mínimo único en que nos gustaría encontrar consultando la menor cantidad posible de nodos con consultas del tipo "¿Eres bueno o malo?".
Este problema se resuelve en Git, el popular sistema de control de versiones, mediante el comando git-bisect
, que ayuda al programador a encontrar la primera confirmación en la que se introdujo un error.
Al principio, el algoritmo implementado por Git supone conocer una única confirmación errónea y una o más confirmaciones válidas. En cada paso de su ejecución, el algoritmo encuentra una confirmación utilizando los siguientes pasos (tomados de aquí ):
Mantenga solo las confirmaciones que:
a) son un antepasado del mal compromiso (incluido el mal compromiso en sí), y
b) no son ancestros de un buen compromiso (excluyendo los buenos compromisos).
A partir de los buenos extremos del gráfico resultante, asocie a cada compromiso el número de antepasados que tiene más uno.
Asociado a cada compromiso , donde es el valor asociado a la confirmación en el paso 2, y es el número total de confirmaciones en el gráfico (después de que se redujo en el paso 1).
El mejor punto de bisección es el commit con el número más alto asociado.
Este algoritmo es esencialmente encontrar el compromiso que logra el "peor de los casos": de hecho, es el número de nodos en el DAG en la próxima iteración en el mejor de los casos, por lo tanto, es el peor de los casos.
Me pregunto:
- ¿Hay alguna diferencia si seleccionamos el "mejor peor de los casos", es decir, el nodo que logra ?
- ¿Es este algoritmo el peor de los casos óptimo?
EDITAR: He notado que este problema tiene un límite de . Considere el DAG formado por un solo nodo con padres llamados . Si sabemos que es malo, entonces tenemos que verificar a cada uno de los padres para ver si son el nodo malo mínimo.
EDIT 2: El anterior es en realidad un límite de , donde es el ancho del poset. En esta respuesta se proporciona un algoritmo alternativo para este problema en cstheory.stackexchange que usa consultas .