Ich hoffe, ich kann etwas Neues zu diesem Problem beitragen. Mir ist aufgefallen, dass alle Antworten die Tatsache vernachlässigen, dass es zwei Punkte gibt, an denen Sie eine Vorverarbeitung durchführen können , ohne Ihre gesamte Wäscheleistung zu beeinträchtigen.
Auch für große Familien müssen wir keine große Anzahl von Socken annehmen. Socken werden aus der Schublade genommen und getragen, und dann werden sie an einen Ort (vielleicht einen Mülleimer) geworfen, an dem sie bleiben, bevor sie gewaschen werden. Obwohl ich besagten Behälter nicht als LIFO-Stapel bezeichnen würde, würde ich sagen, dass es sicher ist, dies anzunehmen
- Leute werfen beide Socken ungefähr in den gleichen Bereich der Tonne,
- Der Bin ist zu keinem Zeitpunkt randomisiert und daher
- Jede Teilmenge, die oben in diesem Fach entnommen wird, enthält im Allgemeinen beide Socken eines Paares.
Da alle mir bekannten Waschmaschinen eine begrenzte Größe haben (unabhängig davon, wie viele Socken Sie waschen müssen) und die eigentliche Randomisierung in der Waschmaschine erfolgt, haben wir immer kleine Untergruppen, die fast keine enthalten Singletons.
Unsere beiden Vorverarbeitungsschritte sind "die Socken auf die Wäscheleine legen" und "die Socken von der Wäscheleine nehmen", was wir tun müssen, um Socken zu erhalten, die nicht nur sauber, sondern auch trocken sind. Wie bei Waschmaschinen sind Wäscheleinen endlich, und ich gehe davon aus, dass wir den gesamten Teil der Linie haben, in dem wir unsere Socken in Sichtweite bringen.
Hier ist der Algorithmus für 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
}
}
Verschwenden Sie nicht Ihre Zeit damit, Socken zu bewegen oder nach der besten Übereinstimmung zu suchen. Dies alles sollte in O (n) erfolgen, was wir auch benötigen würden, um sie einfach unsortiert auf die Linie zu bringen. Die Socken sind noch nicht gepaart, wir haben nur einige Ähnlichkeitscluster auf der Linie. Es ist hilfreich, dass wir hier nur eine begrenzte Anzahl von Socken haben, da dies uns hilft, "gute" Cluster zu erstellen (wenn sich beispielsweise nur schwarze Socken in der Gruppe der Socken befinden, ist das Clustering nach Farben nicht der richtige Weg).
Hier ist der Algorithmus für 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
}
Ich sollte darauf hinweisen, dass es zur Verbesserung der Geschwindigkeit der verbleibenden Schritte ratsam ist, nicht zufällig die nächste Socke auszuwählen, sondern Socken nach Socken nacheinander aus jedem Cluster zu entnehmen. Beide Vorverarbeitungsschritte nehmen nicht mehr Zeit in Anspruch, als nur die Socken auf die Leine oder in den Korb zu legen, was wir auf jeden Fall tun müssen. Dies sollte die Wäscheleistung erheblich verbessern.
Danach ist es einfach, den Hash-Partitionierungsalgorithmus auszuführen. Normalerweise sind ungefähr 75% der Socken bereits gepaart, so dass ich eine sehr kleine Untergruppe von Socken habe, und diese Untergruppe ist bereits (etwas) gruppiert (ich füge nach den Vorverarbeitungsschritten nicht viel Entropie in meinen Korb ein). Eine andere Sache ist, dass die verbleibenden Cluster in der Regel klein genug sind, um sofort verarbeitet zu werden, sodass es möglich ist, einen ganzen Cluster aus dem Warenkorb zu nehmen.
Hier ist der Algorithmus für sort_remaining_clusters ():
while(clusters present in basket) {
Take out the cluster and spread it
Process it immediately
Leave remaining socks where they are
}
Danach sind nur noch wenige Socken übrig. Hier füge ich zuvor ungepaarte Socken in das System ein und verarbeite die verbleibenden Socken ohne speziellen Algorithmus - die verbleibenden Socken sind sehr wenige und können visuell sehr schnell verarbeitet werden.
Für alle verbleibenden Socken gehe ich davon aus, dass ihre Gegenstücke noch ungewaschen sind, und lege sie für die nächste Iteration weg. Wenn Sie im Laufe der Zeit ein Wachstum von ungepaarten Socken feststellen (ein "Sockenleck"), sollten Sie Ihren Behälter überprüfen - er könnte zufällig werden (haben Sie Katzen, die dort schlafen?)
Ich weiß, dass diese Algorithmen viele Annahmen treffen: einen Behälter, der als eine Art LIFO-Stapel fungiert, eine begrenzte, normale Waschmaschine und eine begrenzte, normale Wäscheleine - aber dies funktioniert immer noch mit einer sehr großen Anzahl von Socken.
Informationen zur Parallelität: Solange Sie beide Socken in denselben Behälter werfen, können Sie alle diese Schritte problemlos parallelisieren.