Soit un DAG. Nous savons que certains nœuds de sont "mauvais", tandis que les autres sont "bons"; un descendant d'un mauvais nœud est mauvais tandis que les ancêtres d'un bon nœud sont bons. Nous savons également que les mauvais nœuds ont un élément minimal unique en que nous aimerions trouver interroger le moins de nœuds possible avec des requêtes du type "Êtes-vous bon ou mauvais?".
Ce problème est résolu dans Git, le système de contrôle de version populaire, par la commande git-bisect
, qui aide un programmeur à trouver le premier commit dans lequel un bogue a été introduit.
Au début, l'algorithme implémenté par Git suppose de connaître un seul mauvais commit et un ou plusieurs bons commits. À chaque étape de son exécution, l'algorithme trouve une validation en utilisant les étapes suivantes (prises à partir d' ici ):
Ne conservez que les engagements qui:
a) sont l'ancêtre du mauvais commit (y compris le mauvais commit lui-même), et
b) ne sont pas l'ancêtre d'un bon commit (à l'exclusion des bons commits).
En partant des bonnes extrémités du graphique résultant, associez à chaque commit le nombre d'ancêtres qu'il a plus un.
Associer à chaque validation , où X est la valeur associée à la validation à l'étape 2 et N est le nombre total de validations dans le graphique (après avoir été réduit à l'étape 1).
Le meilleur point de bissection est la validation avec le plus grand nombre associé.
Cet algorithme trouve essentiellement le commit qui atteint le "pire des cas": en fait, est le nombre de nœuds dans le DAG à la prochaine itération dans le meilleur des cas, donc est le pire des cas.
Je me demande:
- Cela fait-il une différence si nous sélectionnons le "meilleur pire cas", c'est-à-dire le nœud qui atteint ?
- Cet algorithme dans le pire des cas est-il optimal?
EDIT: J'ai remarqué que ce problème a un lié. Considérons le DAG formé par un seul nœud avec parents appelé . Si nous savons que est mauvais, nous devons vérifier chacun des parents pour voir s'ils sont le mauvais nœud minimal.
EDIT 2: Le précédent est en fait une borne , où est la largeur du poset. Un algorithme alternatif pour ce problème est donné dans cette réponse sur cstheory.stackexchange qui utilise des requêtes .