Spero di poter contribuire con qualcosa di nuovo a questo problema. Ho notato che tutte le risposte trascurano il fatto che ci sono due punti in cui è possibile eseguire la preelaborazione , senza rallentare le prestazioni generali del bucato.
Inoltre, non abbiamo bisogno di assumere un gran numero di calze, anche per le famiglie numerose. Le calze vengono estratte dal cassetto e vengono indossate, quindi vengono gettate in un posto (forse un bidone) dove rimangono prima di essere lavate. Anche se non chiamerei detto bin uno stack LIFO, direi che è sicuro supporre che
- la gente butta entrambe le calze all'incirca nella stessa area del cestino,
- il cestino non è randomizzato in nessun punto e quindi
- qualsiasi sottoinsieme prelevato dalla parte superiore di questo cestino generalmente contiene entrambi i calzini di una coppia.
Poiché tutte le lavatrici che conosco hanno dimensioni limitate (indipendentemente dal numero di calzini che devi lavare) e l'effettiva randomizzazione si verifica in lavatrice, indipendentemente dal numero di calzini che abbiamo, abbiamo sempre piccoli sottogruppi che contengono quasi single.
Le nostre due fasi di preelaborazione sono "mettere le calze sul filo del bucato" e "Prendere le calze dal filo del bucato", che dobbiamo fare per ottenere calzini non solo puliti ma anche asciutti. Come per le lavatrici, i fili per il bucato sono limitati e presumo che abbiamo l'intera parte della linea in cui mettiamo in vista le nostre calze.
Ecco l'algoritmo per put_socks_on_line ():
while (socks left in basket) {
take_sock();
if (cluster of similar socks is present) {
Add sock to cluster (if possible, next to the matching pair)
} else {
Hang it somewhere on the line, this is now a new cluster of similar-looking socks.
Leave enough space around this sock to add other socks later on
}
}
Non perdere tempo spostando i calzini o cercando la migliore corrispondenza, tutto ciò dovrebbe essere fatto in O (n), che avremmo anche bisogno di metterli sulla linea non ordinata. I calzini non sono ancora accoppiati, abbiamo solo diversi cluster di somiglianza sulla linea. È utile disporre di un numero limitato di calze qui, poiché ciò ci aiuta a creare cluster "buoni" (ad esempio, se nel set di calze ci sono solo calze nere, il raggruppamento per colore non sarebbe la strada da percorrere)
Ecco l'algoritmo per take_socks_from_line ():
while(socks left on line) {
take_next_sock();
if (matching pair visible on line or in basket) {
Take it as well, pair 'em and put 'em away
} else {
put the sock in the basket
}
Devo sottolineare che, al fine di migliorare la velocità dei passaggi rimanenti, è saggio non scegliere casualmente la calza successiva, ma prendere sequenzialmente calza dopo calza da ciascun cluster. Entrambe le fasi di preelaborazione non richiedono più tempo del semplice mettere le calze sulla linea o nel cestino, cosa che non dobbiamo fare in alcun modo, quindi questo dovrebbe migliorare notevolmente le prestazioni del bucato.
Dopodiché, è facile eseguire l'algoritmo di partizionamento hash. Di solito, circa il 75% delle calze è già accoppiato, lasciandomi con un piccolo sottoinsieme di calze, e questo sottoinsieme è già (un po ') raggruppato (non introduco molta entropia nel mio cestino dopo le fasi di preelaborazione). Un'altra cosa è che i cluster rimanenti tendono ad essere abbastanza piccoli da essere gestiti immediatamente, quindi è possibile estrarre un intero cluster dal cestino.
Ecco l'algoritmo per sort_remaining_clusters ():
while(clusters present in basket) {
Take out the cluster and spread it
Process it immediately
Leave remaining socks where they are
}
Dopodiché, sono rimasti solo alcuni calzini. È qui che introduco nel sistema calze precedentemente non accoppiate ed elaboro le calze rimanenti senza alcun algoritmo speciale: le calze rimanenti sono pochissime e possono essere elaborate visivamente molto velocemente.
Per tutte le calze rimanenti, presumo che le loro controparti siano ancora non lavate e le metto via per la prossima iterazione. Se si registra una crescita di calzini non accoppiati nel tempo (una "perdita di calzino"), è necessario controllare il cestino: potrebbe essere randomizzato (ci sono gatti che dormono lì?)
So che questi algoritmi prendono molte ipotesi: un cestino che funge da una sorta di pila LIFO, una lavatrice normale limitata e una stendibiancheria limitata e normale - ma questo funziona ancora con un numero molto elevato di calze.
Informazioni sul parallelismo: finché lanci entrambe le calze nello stesso cestino, puoi facilmente parallelizzare tutti questi passaggi.