problema dichiarazioneNomina Pianificazione (N persone con N-slot liberi occupato, vincolo-soddisfazione)
Abbiamo un datore di lavoro che vuole intervistare N persone, e quindi rende N slot intervista. Ogni persona ha un programma occupato per quelle slot. Dare un algoritmo che pianifica gli N persone in N slot, se possibile, e restituire un flag/error/etc se è impossibile. Qual è la complessità di runtime più veloce possibile?
miei approcci finora
Naive: ci sono N! modi per pianificare N persone. Passa attraverso tutti loro, per ogni permutazione, controlla se è fattibile. O (n!)
Backtracking:
- Cercare eventuali fasce orarie di intervista che possono avere solo 1 persona. Pianifica la persona, rimuovila dall'elenco di candidati e rimuovi lo slot.
- Cerca candidati che possono entrare solo in 1 slot. Pianifica la persona, rimuovila dall'elenco di candidati e rimuovi lo slot.
- Ripetere 1 & 2 finché non ci sono più combinazioni del genere.
- Scegli una persona, programmale in modo casuale in uno degli slot disponibili. Ricorda questa operazione.
- Ripeti 1, 2, 3 finché non abbiamo un programma o c'è un conflitto irrisolvibile. Se abbiamo un programma, restituiscilo. Se c'è un conflitto irrisolvibile, torna indietro.
Questo è il caso peggiore O (n!), Credo - che non è migliore.
Potrebbe esserci un D.P. soluzione pure - ma non la vedo ancora.
Altri pensieri
Il problema può essere rappresentato in una matrice NxN, dove le righe sono "slot", le colonne sono "persone", ed i valori sono "1" gratuitamente e "0" per occupato. Quindi, stiamo cercando una Identity Matrix con scambio di righe in questa matrice. Passaggi 1 & 2 stai cercando una riga o una colonna con un solo "1". (Se il rango della matrice è = N, I significa che esiste una soluzione, ma il contrario non regge) Un altro modo per esaminarlo è trattare la matrice come una matrice di bordo del grafico diretta non pesata. Quindi, i nodi rappresentano ciascuno 1 candidato e 1 slot. Stiamo quindi cercando un insieme di spigoli in modo che ogni nodo nel grafico abbia un bordo in uscita e un margine in entrata. Oppure, con due nodi, sarebbe un grafico bipartito.
Esempio di una matrice:
1 1 1 1
0 1 1 0
1 0 0 1
1 0 0 1
Questo è non problema deterministico che non ha alcuna soluzione in tempo polinomiale. Potresti provare un algoritmo avido ma non calcola tutta la combinazione. – Ankit