Nel mio locale club di squash, c'è una scala che funziona come segue.
- All'inizio della stagione costruiamo un tavolo con il nome di ciascun membro del club su una riga separata.
- Scriviamo quindi il numero di partite vinte e il numero di partite giocate accanto a ciascun nome (nella forma: vittorie / partite del giocatore).
Quindi all'inizio della stagione la tabella si presenta così:
Carol 0/0
Billy 0/0
Alice 0/0
Daffyd 0/0
Ogni due giocatori possono giocare una partita, con un giocatore vincente. Se vince il giocatore più vicino alla parte inferiore del tavolo, viene cambiata la posizione dei giocatori. Ripetiamo quindi il passaggio 2., aggiornando il numero di vittorie e partite accanto a ciascun giocatore. Ad esempio, se Alice batte Billy, lo abbiamo
Carol 0/0
Alice 1/1
Billy 0/1
Daffyd 0/0
Queste partite continuano per tutta la stagione e alla fine portano i giocatori a essere elencati in ordine di forza approssimativo.
Sfortunatamente, l'aggiornamento avviene in modo piuttosto casuale, quindi vengono fatti degli errori. Di seguito sono riportati alcuni esempi di tabelle non valide, ovvero tabelle che non sono state prodotte seguendo correttamente i passaggi precedenti per alcuni ordini di partenza (abbiamo dimenticato l'ordine che abbiamo usato all'inizio della stagione) e la sequenza di partite e risultati:
Alice 0/1
Billy 1/1
Carol 0/1
Daffyd 0/0
Alice 2/3
Billy 0/1
Carol 0/0
Daffyd 0/0
Alice 1/1
Billy 0/2
Carol 2/2
Daffyd 0/1
Data una tabella, come possiamo determinare in modo efficiente se è valido? Potremmo iniziare osservando quanto segue:
L'ordine dei nomi non ha importanza, poiché abbiamo dimenticato l'ordine di partenza originale.
Il numero totale di vittorie dovrebbe essere la metà della somma del numero di partite giocate. (Questo mostra che il primo esempio sopra non è valido.)
- Supponiamo che la tabella sia valida. Poi c'è una multigrafo - un grafico che ammette più fronti ma nessun loop - con ogni vertice corrispondente a un giocatore e ogni bordo di una partita giocata. Quindi il numero totale di partite giocate da ciascun giocatore corrisponde al grado del vertice del giocatore nella multigrafia. Quindi, se non c'è multigrafo con i gradi di vertice appropriati, la tabella deve essere non valida. Ad esempio, non esiste una multigrafo con un vertice di grado uno e uno di grado tre, quindi il secondo esempio non è valido. [Siamo in grado di verificare efficacemente l'esistenza di tale multigraph.]
Quindi abbiamo due controlli che possiamo applicare per iniziare, ma ciò consente comunque tabelle non valide, come il terzo esempio. Per vedere che questa tabella non è valida, possiamo lavorare all'indietro, esaurendo tutti i possibili modi in cui la tabella potrebbe essere sorta.
Mi chiedevo se qualcuno potesse pensare a un algoritmo polinomiale (nel numero di giocatori e nel numero di giochi) che risolve questo problema decisionale?