J'espère pouvoir apporter quelque chose de nouveau à ce problème. J'ai remarqué que toutes les réponses négligent le fait qu'il existe deux points où vous pouvez effectuer un prétraitement , sans ralentir vos performances globales de lessive.
De plus, nous n'avons pas besoin d'assumer un grand nombre de chaussettes, même pour les familles nombreuses. Les chaussettes sont retirées du tiroir et sont portées, puis jetées dans un endroit (peut-être une poubelle) où elles restent avant d'être lavées. Bien que je n'appellerais pas ledit bac une pile LIFO, je dirais qu'il est sûr de supposer que
- les gens jettent leurs deux chaussettes à peu près dans la même zone de la poubelle,
- le bac n'est pas randomisé à aucun moment, et donc
- tout sous-ensemble pris du haut de ce bac contient généralement les deux chaussettes d'une paire.
Étant donné que toutes les machines à laver que je connais sont de taille limitée (quel que soit le nombre de chaussettes que vous devez laver), et la randomisation réelle se produit dans la machine à laver, peu importe le nombre de chaussettes que nous avons, nous avons toujours de petits sous-ensembles qui ne contiennent presque pas de singletons.
Nos deux étapes de prétraitement sont «mettre les chaussettes sur la corde à linge» et «retirer les chaussettes de la corde à linge», ce que nous devons faire, afin d'obtenir des chaussettes non seulement propres mais aussi sèches. Comme pour les machines à laver, les cordes à linge sont finies, et je suppose que nous avons toute la partie de la ligne où nous mettons nos chaussettes en vue.
Voici l'algorithme pour 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
}
}
Ne perdez pas votre temps à déplacer des chaussettes ou à chercher la meilleure combinaison, tout cela devrait être fait en O (n), dont nous aurions également besoin pour les mettre sur la ligne sans tri. Les chaussettes ne sont pas encore appariées, nous n'avons que plusieurs groupes de similitudes sur la ligne. Il est utile que nous ayons un ensemble limité de chaussettes ici, car cela nous aide à créer de "bons" clusters (par exemple, s'il n'y a que des chaussettes noires dans l'ensemble de chaussettes, le regroupement par couleurs ne serait pas la voie à suivre)
Voici l'algorithme pour 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
}
Je dois souligner que pour améliorer la vitesse des étapes restantes, il est sage de ne pas choisir aléatoirement la prochaine chaussette, mais de prendre séquentiellement chaussette après chaussette de chaque cluster. Les deux étapes de prétraitement ne prennent pas plus de temps que de simplement mettre les chaussettes sur la ligne ou dans le panier, ce que nous devons faire quoi qu'il arrive, cela devrait donc améliorer considérablement les performances du linge.
Après cela, il est facile de faire l'algorithme de partitionnement de hachage. Habituellement, environ 75% des chaussettes sont déjà appariées, me laissant avec un très petit sous-ensemble de chaussettes, et ce sous-ensemble est déjà (quelque peu) groupé (je n'introduis pas beaucoup d'entropie dans mon panier après les étapes de prétraitement). Une autre chose est que les grappes restantes ont tendance à être suffisamment petites pour être manipulées en même temps, il est donc possible de retirer une grappe entière du panier.
Voici l'algorithme pour sort_remaining_clusters ():
while(clusters present in basket) {
Take out the cluster and spread it
Process it immediately
Leave remaining socks where they are
}
Après cela, il ne reste plus que quelques chaussettes. C'est là que j'introduis des chaussettes non appariées dans le système et traite les chaussettes restantes sans algorithme spécial - les chaussettes restantes sont très peu nombreuses et peuvent être traitées visuellement très rapidement.
Pour toutes les chaussettes restantes, je suppose que leurs homologues ne sont toujours pas lavés et les range pour la prochaine itération. Si vous enregistrez une croissance de chaussettes non appariées au fil du temps (une "fuite de chaussette"), vous devriez vérifier votre poubelle - elle pourrait être randomisée (avez-vous des chats qui dorment là-dedans?)
Je sais que ces algorithmes prennent beaucoup d'hypothèses: une poubelle qui agit comme une sorte de pile LIFO, une machine à laver normale limitée et une corde à linge normale limitée - mais cela fonctionne toujours avec un très grand nombre de chaussettes.
À propos du parallélisme: Tant que vous jetez les deux chaussettes dans le même bac, vous pouvez facilement paralléliser toutes ces étapes.