Lascia che sia un DAG. Sappiamo che alcuni nodi in sono "cattivi", mentre altri sono "buoni"; un discendente di un nodo cattivo è cattivo mentre gli antenati di un nodo buono sono buoni. Sappiamo anche che i nodi danneggiati hanno un unico elemento minimo in che vorremmo trovare interrogando il minor numero possibile di nodi con query del tipo "Sei buono o cattivo?".
Questo problema è risolto in Git, il popolare sistema di controllo della versione, tramite il comando git-bisect
, che aiuta un programmatore a trovare il primo commit in cui è stato introdotto un bug.
All'inizio, l'algoritmo implementato da Git presuppone di conoscere un singolo commit errato e uno o più commit positivi. Ad ogni passaggio della sua esecuzione, l'algoritmo trova un commit usando i seguenti passaggi (presi da qui ):
Tieni solo gli impegni che:
a) sono antenati del cattivo commesso (incluso il cattivo commesso stesso), e
b) non sono antenati di un buon impegno (esclusi i buoni impegni).
A partire dalle estremità buone del grafico risultante, associa a ciascun commit il numero di antenati che ha più uno.
Associare a ciascun commit , dove X è il valore associato al commit nel passaggio 2 e N è il numero totale di commit nel grafico (dopo che è stato ridotto nel passaggio 1).
Il miglior punto di taglio è il commit con il numero associato più alto.
Questo algoritmo sta essenzialmente trovando il commit che ottiene il "peggior caso": in effetti, è il numero di nodi nel DAG alla successiva iterazione nel migliore dei casi, quindi è il peggior caso migliore.
Mi sto chiedendo:
- Fa differenza se selezioniamo il "miglior caso peggiore", ovvero il nodo che raggiunge ?
- Questo algoritmo nel caso peggiore è ottimale?
EDIT: ho notato che questo problema ha un limite . Considera il DAG formato da un singolo nodo con genitori chiamati . Se sappiamo che è male, allora controlliamo ciascuno dei genitori per vedere se sono il nodo minimo cattivo.
EDIT 2: Il precedente è in realtà un associato, dove è la larghezza del poset. Un algoritmo alternativo per questo problema è riportato in questa risposta su cstheory.stackexchange che utilizza query .