Gestern habe ich die Socken aus der sauberen Wäsche gepaart und herausgefunden, dass meine Arbeitsweise nicht sehr effizient ist. Ich machte eine naive Suche - nahm eine Socke und "iterierte" den Stapel, um sein Paar zu finden. Dies erfordert Iterieren über n / 2 * n / 4 = n 2 /8 Socken im Durchschnitt.
Als Informatiker dachte ich, was ich tun könnte? Das Sortieren (nach Größe / Farbe / ...) kam natürlich in den Sinn, um eine O (NlogN) -Lösung zu erhalten.
Hashing oder andere nicht vorhandene Lösungen sind keine Option, da ich meine Socken nicht duplizieren kann (obwohl es schön sein könnte, wenn ich könnte).
Die Frage ist also im Grunde:
Was ist bei einem Stapel von n
Sockenpaaren, die 2n
Elemente enthalten (vorausgesetzt, jede Socke hat genau ein passendes Paar), der beste Weg, um sie effizient mit bis zu logarithmischem zusätzlichen Platz zu verbinden? (Ich glaube, ich kann mich bei Bedarf an diese Menge an Informationen erinnern.)
Ich freue mich über eine Antwort, die folgende Aspekte behandelt:
- Eine allgemeine theoretische Lösung für eine Vielzahl von Socken.
- Die tatsächliche Anzahl der Socken ist nicht so groß, ich glaube meinem Ehepartner nicht und ich habe mehr als 30 Paare. (Und es ist ziemlich einfach, zwischen meinen und ihren Socken zu unterscheiden; kann dies auch verwendet werden?)
- Entspricht es dem Problem der Elementunterscheidbarkeit ?
waitpid
damit Sie als Eltern nicht einmal selbst Socken sortieren?Antworten:
Es wurden Sortierlösungen vorgeschlagen, aber das Sortieren ist etwas zu viel : Wir brauchen keine Ordnung; Wir brauchen nur Gleichstellungsgruppen .
So Hashing würde ausreichen , um (und schneller).
Diese Art der rekursiven Hash-Partitionierung wird tatsächlich von SQL Server durchgeführt, wenn ein Hash-Join oder eine Hash-Aggregation über große Datenmengen erforderlich ist. Es verteilt seinen Build-Eingabestream auf viele Partitionen, die unabhängig sind. Dieses Schema skaliert linear auf beliebige Datenmengen und mehrere CPUs.
Sie benötigen keine rekursive Partitionierung, wenn Sie einen Verteilungsschlüssel (Hash-Schlüssel) finden, der genügend Buckets bereitstellt, sodass jeder Bucket klein genug ist, um sehr schnell verarbeitet zu werden. Leider glaube ich nicht, dass Socken eine solche Eigenschaft haben.
Wenn jede Socke eine Ganzzahl namens "PairID" hätte, könnte man sie leicht in 10 Eimer gemäß
PairID % 10
(der letzten Ziffer) verteilen .Die beste Partitionierung in der realen Welt, die ich mir vorstellen kann, ist das Erstellen eines Rechtecks aus Stapeln : Eine Dimension ist Farbe, die andere ist das Muster. Warum ein Rechteck? Weil wir O (1) zufälligen Zugriff auf Pfähle brauchen. (Ein 3D- Quader würde auch funktionieren, aber das ist nicht sehr praktisch.)
Aktualisieren:
Was ist mit Parallelität ? Können mehrere Menschen schneller zu den Socken passen?
Was ist mit dem Problem der Elementunterscheidbarkeit ? Wie im Artikel angegeben, kann das Problem der Elementunterscheidbarkeit in gelöst werden
O(N)
. Dies gilt auch für das Sockenproblem (auchO(N)
wenn Sie nur einen Verteilungsschritt benötigen (ich habe mehrere Schritte nur vorgeschlagen, weil Menschen schlecht in Berechnungen sind - ein Schritt reicht aus, wenn Sie weiterverteilenmd5(color, length, pattern, ...)
, dh einen perfekten Hash aller Attribute)).Natürlich kann man nicht schneller fahren als
O(N)
, also haben wir die optimale Untergrenze erreicht .Obwohl die Ausgänge nicht genau gleich sind (in einem Fall nur ein Boolescher Wert. In dem anderen Fall die Sockenpaare), sind die asymptotischen Komplexitäten gleich.
quelle
Da sich die Architektur des menschlichen Gehirns völlig von einer modernen CPU unterscheidet, ist diese Frage praktisch nicht sinnvoll.
Menschen können CPU-Algorithmen für sich gewinnen, indem sie "ein passendes Paar finden" eine Operation für einen Satz sein können, der nicht zu groß ist.
Mein Algorithmus:
Zumindest verwende ich das im wirklichen Leben und finde es sehr effizient. Der Nachteil ist, dass es eine flache Oberfläche erfordert, aber normalerweise reichlich vorhanden ist.
quelle
Fall 1 : Alle Socken sind identisch (das mache ich übrigens im wirklichen Leben).
Wählen Sie zwei davon aus, um ein Paar zu bilden. Ständige Zeit.
Fall 2 : Es gibt eine konstante Anzahl von Kombinationen (Besitz, Farbe, Größe, Textur usw.).
Verwenden Sie die Radix-Sortierung . Dies ist nur eine lineare Zeit, da kein Vergleich erforderlich ist.
Fall 3 : Die Anzahl der Kombinationen ist nicht im Voraus bekannt (allgemeiner Fall).
Wir müssen einen Vergleich durchführen, um zu überprüfen, ob zwei Socken paarweise geliefert werden. Wählen Sie einen der
O(n log n)
vergleichsbasierten Sortieralgorithmen.Im wirklichen Leben, wenn die Anzahl der Socken relativ klein (konstant) ist, würden diese theoretisch optimalen Algorithmen jedoch nicht gut funktionieren. Es kann sogar noch länger dauern als die sequentielle Suche, die theoretisch eine quadratische Zeit erfordert.
quelle
Nicht algorithmische Antwort, aber "effizient", wenn ich es tue:
Schritt 1) Entsorgen Sie alle vorhandenen Socken
Schritt 2) Gehen Sie zu Walmart und kaufen Sie sie in Paketen mit 10 - n Päckchen Weiß und m Päckchen Schwarz. Keine Notwendigkeit für andere Farben im Alltag.
Aber von Zeit zu Zeit muss ich das noch einmal machen (verlorene Socken, beschädigte Socken usw.), und ich hasse es, perfekt gute Socken zu oft wegzuwerfen (und ich wünschte, sie verkaufen immer die gleiche Sockenreferenz!), Also habe ich kürzlich genommen Ein anderer Versuch.
Algorithmische Antwort:
Bedenken Sie, dass Ihre Wahrscheinlichkeit, bei einer naiven Suche die passende Socke zu finden, sehr gering ist, wenn Sie nur eine Socke für den zweiten Sockenstapel ziehen.
Warum fünf? Normalerweise sind Menschen gut darin, sich an fünf bis sieben verschiedene Elemente im Arbeitsspeicher zu erinnern - ein bisschen wie das menschliche Äquivalent eines RPN- Stapels - fünf ist ein sicherer Standard.
Nimm einen vom Stapel 2n-5.
Suchen Sie nun nach einer Übereinstimmung (visuelle Musterübereinstimmung - Menschen können das gut mit einem kleinen Stapel) innerhalb der fünf, die Sie gezeichnet haben. Wenn Sie keine finden, fügen Sie diese zu Ihren fünf hinzu.
Wähle weiterhin zufällig Socken vom Stapel und vergleiche sie mit deinen 5 + 1-Socken für ein Match. Wenn Ihr Stack wächst, wird dies Ihre Leistung verringern, aber Ihre Chancen erhöhen. Viel schneller.
Schreiben Sie die Formel auf, um zu berechnen, wie viele Stichproben Sie für eine 50% ige Gewinnchance ziehen müssen. IIRC ist ein hypergeometrisches Gesetz.
Ich mache das jeden Morgen und brauche selten mehr als drei Draws - aber ich habe
n
ähnliche Paare (ungefähr 10, gib oder nimm die verlorenen)m
geformter weißer Socken. Jetzt können Sie die Größe meines Lagerstapels schätzen :-)Übrigens stellte ich fest, dass die Summe der Transaktionskosten für das Sortieren aller Socken jedes Mal, wenn ich ein Paar benötigte, weitaus geringer war als einmal und das Binden der Socken. Ein Just-in-Time funktioniert besser, weil Sie dann die Socken nicht binden müssen und es auch eine abnehmende marginale Rendite gibt (das heißt, Sie suchen immer nach den zwei oder drei Socken, die Sie irgendwo in der Wäsche haben und die Sie brauchen um das Matching Ihrer Socken zu beenden und Sie verlieren Zeit dafür).
quelle
Ich nehme die erste Socke und lege sie hin (z. B. am Rand der Wäscheschale). Dann nehme ich eine andere Socke und überprüfe, ob sie mit der ersten Socke identisch ist. Wenn ja, entferne ich beide. Wenn nicht, lege ich es neben die erste Socke. Dann nehme ich die dritte Socke und vergleiche sie mit den ersten beiden (wenn sie noch da sind). Usw.
Dieser Ansatz kann ziemlich einfach in einem Array implementiert werden, vorausgesetzt, dass das "Entfernen" von Socken eine Option ist.Eigentlich müssen Sie nicht einmal Socken "entfernen". Wenn Sie die Socken nicht sortieren müssen (siehe unten), können Sie sie einfach verschieben und erhalten ein Array, in dem alle Socken paarweise im Array angeordnet sind.Unter der Annahme, dass die einzige Operation für Socken darin besteht, die Gleichheit zu vergleichen, ist dieser Algorithmus im Grunde immer noch ein n 2 -Algorithmus, obwohl ich nichts über den Durchschnittsfall weiß (ich habe nie gelernt, das zu berechnen).
Das Sortieren verbessert natürlich die Effizienz, insbesondere im wirklichen Leben, wo Sie leicht eine Socke zwischen zwei andere Socken "einführen" können. Bei der Berechnung könnte das gleiche durch einen Baum erreicht werden, aber das ist zusätzlicher Platz. Und natürlich sind wir wieder bei NlogN (oder ein bisschen mehr, wenn es mehrere Socken gibt, die nach Sortierkriterien gleich sind, aber nicht aus demselben Paar).
Davon abgesehen fällt mir nichts ein, aber diese Methode scheint im wirklichen Leben ziemlich effizient zu sein. :) :)
quelle
Dies stellt die falsche Frage. Die richtige Frage ist, warum ich Zeit damit verbringe, Socken zu sortieren. Wie viel kostet es jährlich, wenn Sie Ihre Freizeit für X Geldeinheiten Ihrer Wahl bewerten?
Und meistens ist dies nicht irgendeine Freizeit, sondern eine morgendliche Freizeit, die Sie im Bett verbringen, an Ihrem Kaffee nippen oder etwas früher abreisen und nicht im Verkehr gefangen werden können.
Es ist oft gut, einen Schritt zurückzutreten und das Problem zu umgehen.
Und es gibt einen Weg!
Finde eine Socke, die du magst. Berücksichtigen Sie alle relevanten Merkmale: Farbe bei unterschiedlichen Lichtverhältnissen, Gesamtqualität und Haltbarkeit, Komfort bei unterschiedlichen Klimabedingungen und Geruchsabsorption. Wichtig ist auch, dass sie bei der Lagerung nicht an Elastizität verlieren, sodass natürliche Stoffe gut sind und in einer Plastikverpackung erhältlich sein sollten.
Es ist besser, wenn es keinen Unterschied zwischen linken und rechten Fußsocken gibt, aber es ist nicht kritisch. Wenn die Socken von links nach rechts symmetrisch sind, ist das Finden eines Paares eine O (1) -Operation, und das Sortieren der Socken ist eine ungefähre O (M) -Operation, wobei M die Anzahl der Stellen in Ihrem Haus ist, die Sie mit Socken übersät haben, idealerweise einige kleine konstante Zahl.
Wenn Sie sich für ein ausgefallenes Paar mit unterschiedlichen linken und rechten Socken entschieden haben, nehmen Sie O (N + M), wobei N die Anzahl der Socken und M die gleiche wie oben ist. Jemand anderes kann die Formel für durchschnittliche Iterationen des Findens des ersten Paares angeben, aber der schlechteste Fall für das Finden eines Paares mit blinder Suche ist N / 2 + 1, was für vernünftiges N astronomisch unwahrscheinlich wird. Dies kann durch Verwendung eines erweiterten Bildes beschleunigt werden Erkennungsalgorithmen und Heuristiken beim Scannen des Stapels unsortierter Socken mit Mk1 Eyeball .
Ein Algorithmus zum Erreichen der Effizienz der O (1) -Sockenpaarung (unter der Annahme einer symmetrischen Socke) lautet also:
Sie müssen abschätzen, wie viele Paar Socken Sie für den Rest Ihres Lebens benötigen, oder vielleicht bis Sie in Rente gehen und in ein wärmeres Klima ziehen, ohne jemals wieder Socken tragen zu müssen. Wenn Sie jung sind, können Sie auch abschätzen, wie lange es dauert, bis wir alle Socken-Sortierroboter in unseren Häusern haben, und das ganze Problem wird irrelevant.
Sie müssen herausfinden, wie Sie Ihre ausgewählte Socke in loser Schüttung bestellen können, wie viel sie kostet und wie sie geliefert wird.
Bestellen Sie die Socken!
Werde deine alten Socken los.
Ein alternativer Schritt 3 würde darin bestehen, die Kosten für den Kauf der gleichen Menge vielleicht billigerer Socken über die Jahre hinweg paarweise zu vergleichen und die Kosten für das Sortieren von Socken zu addieren, aber nehmen Sie mein Wort: Der Kauf in loser Schüttung ist billiger! Außerdem erhöhen Socken im Lager mit der Inflationsrate des Aktienkurses an Wert, was mehr ist, als Sie bei vielen Investitionen erhalten würden. Andererseits gibt es auch Lagerkosten, aber Socken nehmen im obersten Regal eines Schranks wirklich nicht viel Platz ein.
Problem gelöst. Holen Sie sich einfach neue Socken, werfen / spenden Sie Ihre alten weg und leben Sie glücklich, nachdem Sie wissen, dass Sie für den Rest Ihres Lebens jeden Tag Geld und Zeit sparen.
quelle
Die theoretische Grenze ist O (n), da Sie jede Socke berühren müssen (es sei denn, einige sind bereits irgendwie gepaart).
Sie können O (n) mit Radix-Sortierung erreichen . Sie müssen nur einige Attribute für die Eimer auswählen.
Wenn Sie eine begrenzte Anzahl von Attributen auswählen können, aber genügend Attribute, die jedes Paar eindeutig identifizieren können, sollten Sie in O (k * n) arbeiten, was O (n) ist, wenn wir berücksichtigen können, dass k begrenzt ist.
quelle
$
Charakter, damit deine Sachen code-y aussehen.Als praktische Lösung:
Wenn Sie 1000 Socken mit 8 Farben und einer durchschnittlichen Verteilung haben, können Sie 4 Stapel von jeweils 125 Socken in c * n-Zeit herstellen. Mit einer Schwelle von 5 Socken können Sie jeden Stapel in 6 Läufen sortieren. (Wenn Sie 2 Sekunden zählen, um eine Socke auf den richtigen Stapel zu werfen, benötigen Sie weniger als 4 Stunden.)
Wenn Sie nur 60 Socken, 3 Farben und 2 Arten von Socken (Ihre / die Ihrer Frau) haben, können Sie jeden Stapel von 10 Socken in 1 Durchläufen sortieren (erneut Schwelle = 5). (Nach 2 Sekunden dauert es 2 Minuten).
Die anfängliche Sortierung der Eimer beschleunigt Ihren Prozess, da Ihre n Socken
c*n
rechtzeitig in k Eimer aufgeteilt werden, sodass Sie nur nochc*n*log(k)
arbeiten müssen. (Ohne Berücksichtigung der Schwelle). Alles in allem erledigen Sie also Ihren*c*(1 + log(k))
Arbeit, wobei c die Zeit ist, eine Socke auf einen Stapel zu werfen.Dieser Ansatz ist im Vergleich zu jeder
c*x*n + O(1)
Methode ungefähr so lange günstig wielog(k) < x - 1
.In der Informatik kann dies hilfreich sein: Wir haben eine Sammlung von n Dingen , eine Reihenfolge (Länge) und auch eine Äquivalenzbeziehung (zusätzliche Informationen, zum Beispiel die Farbe von Socken). Die Äquivalenzbeziehung ermöglicht es uns, eine Partition der ursprünglichen Sammlung zu erstellen, und in jeder Äquivalenzklasse wird unsere Reihenfolge weiterhin beibehalten. Die Zuordnung eines Objekts zu seiner Äquivalenzklasse kann in O (1) erfolgen, sodass nur O (n) erforderlich ist, um jedes Element einer Klasse zuzuweisen. Jetzt haben wir unsere zusätzlichen Informationen verwendet und können jede Klasse auf beliebige Weise sortieren. Der Vorteil ist, dass die Datensätze bereits deutlich kleiner sind.
Die Methode kann auch verschachtelt werden, wenn wir mehrere Äquivalenzbeziehungen haben -> Farbstapel erstellen, als innerhalb jeder Stapelpartition auf Textur, als nach Länge sortieren. Jede Äquivalenzbeziehung, die eine Partition mit mehr als 2 Elementen mit ungefähr gleicher Größe erstellt, führt zu einer Geschwindigkeitsverbesserung gegenüber dem Sortieren (vorausgesetzt, wir können dem Stapel direkt eine Socke zuweisen), und das Sortieren kann bei kleineren Datensätzen sehr schnell erfolgen.
quelle
Sie versuchen, das falsche Problem zu lösen.
Lösung 1: Binden Sie schmutzige Socken jedes Mal, wenn Sie sie in Ihren Wäschekorb legen, zu einem kleinen Knoten zusammen. Auf diese Weise müssen Sie nach dem Waschen keine Sortierung mehr durchführen. Stellen Sie sich vor, Sie registrieren einen Index in einer Mongo-Datenbank. Ein wenig Arbeit voraus für einige CPU-Einsparungen in der Zukunft.
Lösung 2: Wenn es Winter ist, müssen Sie keine passenden Socken tragen. Wir sind Programmierer. Niemand muss es wissen, solange es funktioniert.
Lösung 3: Verteilen Sie die Arbeit. Sie möchten einen so komplexen CPU-Prozess asynchron ausführen, ohne die Benutzeroberfläche zu blockieren. Nehmen Sie diesen Stapel Socken und stopfen Sie sie in eine Tasche. Suchen Sie nur dann nach einem Paar, wenn Sie es brauchen. Auf diese Weise fällt der Arbeitsaufwand viel weniger auf.
Hoffe das hilft!
quelle
Diese Frage ist eigentlich zutiefst philosophisch. Im Kern geht es darum, ob die Fähigkeit der Menschen, Probleme zu lösen (die "Wetware" unseres Gehirns), dem entspricht, was mit Algorithmen erreicht werden kann.
Ein offensichtlicher Algorithmus zum Sortieren von Socken ist:
Jetzt dreht sich in der Informatik in diesem Problem alles um die Schritte
Menschen werden verschiedene Strategien anwenden, um diese zu bewirken. Das menschliche Gedächtnis ist assoziativ , so etwas wie eine Hash-Tabelle, in der Feature-Sets gespeicherter Werte mit den entsprechenden Werten selbst gepaart werden. Zum Beispiel wird das Konzept des "roten Autos" allen roten Autos zugeordnet, an die sich eine Person erinnern kann. Jemand mit einem perfekten Gedächtnis hat eine perfekte Zuordnung. Die meisten Menschen sind in dieser Hinsicht unvollkommen (und die meisten anderen). Die assoziative Karte hat eine begrenzte Kapazität. Zuordnungen können piepen unter verschiedenen Umständen nicht mehr existieren (ein Bier zu viel), irrtümlich aufgezeichnet werden ("Ich dachte, ihr Name war Betty, nicht Nettie") oder niemals überschrieben werden, obwohl wir beobachten, dass sich die Wahrheit geändert hat ("Papas Auto" ruft hervor "orange Firebird", als wir tatsächlich wussten, dass er das gegen den roten Camaro eingetauscht hatte).
Im Fall von Socken bedeutet perfekter Rückruf, dass das Betrachten einer Socke
s
immer die Erinnerung an ihr Geschwister erzeugtt
, einschließlich genügend Informationen (wo sie sich auf dem Bügelbrett befindet), um siet
in konstanter Zeit zu lokalisieren . Eine Person mit fotografischem Gedächtnis erreicht sowohl 1 als auch 2 in konstanter Zeit ohne Fehler.Jemand mit weniger als perfektem Gedächtnis könnte einige Commonsense-Äquivalenzklassen verwenden, die auf Merkmalen innerhalb seiner Fähigkeit basieren, zu verfolgen: Größe (Papa, Mama, Baby), Farbe (grünlich, rötlich usw.), Muster (Argyle, Plain usw.) , Stil (Footie, kniehoch usw.). Das Bügelbrett würde also in Abschnitte für die Kategorien unterteilt. Dies ermöglicht normalerweise, dass die Kategorie in konstanter Zeit nach Speicher lokalisiert wird, dann ist jedoch eine lineare Suche durch die Kategorie "Bucket" erforderlich.
Jemand ohne Gedächtnis oder Vorstellungskraft (sorry) wird nur die Socken auf einem Stapel behalten und eine lineare Suche des gesamten Stapels durchführen.
Ein ordentlicher Freak könnte numerische Bezeichnungen für Paare verwenden, wie jemand vorgeschlagen hat. Dies öffnet die Tür zu einer vollständigen Reihenfolge, die es dem Menschen ermöglicht, genau die gleichen Algorithmen zu verwenden, die wir mit einer CPU verwenden könnten: binäre Suche, Bäume, Hashes usw.
Der "beste" Algorithmus hängt also von den Eigenschaften der Wetware / Hardware / Software ab, auf der er ausgeführt wird, und von unserer Bereitschaft, zu "schummeln", indem wir Paaren eine Gesamtreihenfolge auferlegen. Sicherlich ist es ein "bester" Meta- Algorithmus, den weltbesten Socken-Sortierer einzustellen: eine Person oder Maschine, die eine große Menge N von Sockenattribut-Sets in einem 1-1-assoziativen Speicher mit konstanter Zeitsuche, Einfügen, Einfügen, schnell erwerben und speichern kann. und löschen. Sowohl Menschen als auch Maschinen wie diese können beschafft werden. Wenn Sie eine haben, können Sie alle Socken in O (N) Zeit für N Paare koppeln, was optimal ist. Mit den Gesamtauftrags-Tags können Sie Standard-Hashing verwenden, um das gleiche Ergebnis mit einem menschlichen oder einem Hardware-Computer zu erzielen.
quelle
Kosten: Socken bewegen -> hoch, Socken in der Schlange finden / suchen -> klein
Wir möchten die Anzahl der Züge reduzieren und durch die Anzahl der Suchvorgänge kompensieren. Außerdem können wir die Multithred-Umgebung des Homo Sapiens nutzen, um mehr Dinge im Entscheidungscache zu speichern.
X = Ihre, Y = Ihre Ehepartner
Von Stapel A aller Socken:
Wählen Sie zwei Socken aus, platzieren Sie die entsprechende X-Socke in der X-Linie und die Y-Socke in der Y-Linie an der nächsten verfügbaren Position.
Tun Sie, bis A leer ist.
Für jede Zeile X und Y.
Wählen Sie die erste Socke in der Reihe aus und suchen Sie entlang der Linie, bis die entsprechende Socke gefunden wird.
In die entsprechende fertige Sockenreihe legen.
Optional zu Schritt eins nehmen Sie zwei Socken von dieser Zeile anstelle von zwei, da der Caching-Speicher groß genug ist, können wir schnell feststellen, ob eine der Socken mit der aktuellen in der beobachteten Zeile übereinstimmt. Wenn Sie das Glück haben, drei Arme zu haben, können Sie möglicherweise drei Socken gleichzeitig analysieren, da die Erinnerung an das Motiv groß genug ist.
Tun Sie dies, bis sowohl X als auch Y leer sind.
Erledigt
Da dies jedoch eine ähnliche Komplexität als Auswahlsortierung aufweist, ist die benötigte Zeit aufgrund der Geschwindigkeit von E / A (sich bewegende Socken) und Suchen (Durchsuchen der Linie nach einer Socke) weitaus geringer.
quelle
Hier ist eine Omega (n log n) -Untergrenze im vergleichsbasierten Modell. (Die einzig gültige Operation ist der Vergleich zweier Socken.)
Angenommen, Sie wissen, dass Ihre 2n-Socken folgendermaßen angeordnet sind:
p 1 p 2 p 3 ... p n p f (1) p f (2) ... p f (n)
Dabei ist f eine unbekannte Permutation der Menge {1,2, ..., n}. Das zu wissen kann das Problem nicht erschweren. Es gibt n! Mögliche Ausgaben (Übereinstimmungen zwischen der ersten und der zweiten Hälfte), was bedeutet, dass Sie log (n!) = Omega (n log n) Vergleiche benötigen. Dies ist durch Sortieren möglich.
Da Sie an Verbindungen zum Problem der Elementunterscheidbarkeit interessiert sind, ist es schwieriger zu beweisen, dass Omega (n log n) für die Elementunterscheidbarkeit gebunden ist, da die Ausgabe binär Ja / Nein ist. Hier muss die Ausgabe übereinstimmen und die Anzahl der möglichen Ausgaben reicht aus, um eine anständige Grenze zu erhalten. Es gibt jedoch eine Variante, die mit der Unterscheidbarkeit von Elementen verbunden ist. Angenommen, Sie erhalten 2n Socken und fragen sich, ob sie eindeutig gepaart werden können. Sie können eine Reduzierung von ED erhalten, indem Sie (a 1 , a 2 , ..., a n ) an (a 1 , a 1 , a 2 , a ) senden 2 , ..., a n , a n ) . (In Klammern ist der Nachweis der Härte von ED über die Topologie sehr interessant.)
Ich denke, dass es ein Omega (n 2 ) für das ursprüngliche Problem geben sollte, wenn Sie nur Gleichheitstests zulassen. Meine Intuition lautet: Betrachten Sie ein Diagramm, in dem Sie nach einem Test eine Kante hinzufügen, und argumentieren Sie, dass die Ausgabe nicht eindeutig bestimmt wird, wenn das Diagramm nicht dicht ist.
quelle
So mache ich das eigentlich für p Paar Socken ( n = 2p einzelne Socken):
Das schlimmste Szenario dieses Schemas ist, dass jedes Sockenpaar so unterschiedlich ist, dass es genau übereinstimmen muss und dass die ersten n / 2 Socken, die Sie auswählen, alle unterschiedlich sind. Dies ist Ihr O (n 2 ) -Szenario und äußerst unwahrscheinlich. Wenn die Anzahl der eindeutigen Sockentypen t geringer ist als die Anzahl der Paare p = n / 2 und die Socken in jedem Typ gleich genug sind (normalerweise in Bezug auf den Verschleiß), kann jede Socke dieses Typs mit jeder gepaart werden andere, dann, wie ich oben gefolgert habe, ist die maximale Anzahl von Socken, mit denen Sie jemals vergleichen müssen, t , wonach die nächste, die Sie ziehen, wirdpassen Sie zu einer der ungepaarten Socken. Dieses Szenario ist in der durchschnittlichen Sockenschublade viel wahrscheinlicher als im schlimmsten Fall und reduziert die Komplexität im schlimmsten Fall auf O (n * t), wobei normalerweise t << n ist .
quelle
Realer Ansatz:
Entfernen Sie so schnell wie möglich die Socken einzeln vom unsortierten Stapel und legen Sie sie in Stapel vor sich. Die Stapel sollten etwas platzsparend angeordnet sein, wobei alle Socken in die gleiche Richtung zeigen. Die Anzahl der Stapel ist durch die Entfernung begrenzt, die Sie leicht erreichen können. Die Auswahl eines Stapels, auf den eine Socke gelegt werden soll, sollte - so schnell wie möglich - erfolgen, indem eine Socke auf einen Stapel scheinbar ähnlicher Socken gelegt wird. Der gelegentliche Fehler vom Typ I (eine Socke auf einen Stapel legen, zu dem er nicht gehört) oder vom Typ II (eine Socke in einen eigenen Stapel legen, wenn ein Stapel ähnlicher Socken vorhanden ist) kann toleriert werden - die wichtigste Überlegung ist die Geschwindigkeit .
Sobald sich alle Socken in Stapeln befinden, gehen Sie schnell durch die Stapel mit mehreren Socken, bilden Paare und entfernen sie (diese gehen in Richtung Schublade). Wenn sich nicht passende Socken auf dem Stapel befinden, stapeln Sie sie wieder auf den besten Stapel (innerhalb der möglichst schnellen Beschränkung). Wenn alle Stapel mit mehreren Socken verarbeitet wurden, stimmen Sie die verbleibenden paarweisen Socken ab, die aufgrund von Typ-II-Fehlern nicht gepaart wurden. Wusch, du bist fertig - und ich habe viele Socken und wasche sie erst, wenn ein großer Teil schmutzig ist. Noch ein praktischer Hinweis: Ich klappe die Oberseite eines Paares Socken über das andere und nutze dabei ihre elastischen Eigenschaften, damit sie beim Transport zur Schublade und in der Schublade zusammen bleiben.
quelle
Aus Ihrer Frage geht hervor, dass Sie nicht viel Erfahrung mit Wäsche haben :). Sie benötigen einen Algorithmus, der mit einer kleinen Anzahl nicht paarbarer Socken gut funktioniert.
Die bisherigen Antworten nutzen unsere Funktionen zur Erkennung menschlicher Muster nicht gut aus. Das Spiel Set bietet einen Hinweis darauf, wie man das gut macht: Legen Sie alle Socken in einen zweidimensionalen Raum, damit Sie sie gut erkennen und leicht mit Ihren Händen erreichen können. Dies beschränkt Sie auf eine Fläche von ca. 120 * 80 cm. Wählen Sie dort die Paare aus, die Sie erkennen, und entfernen Sie sie. Legen Sie zusätzliche Socken in den freien Raum und wiederholen Sie. Wenn Sie sich für Personen mit leicht erkennbaren Socken waschen (kleine Kinder kommen in den Sinn), können Sie eine Radix-Sortierung durchführen, indem Sie zuerst diese Socken auswählen. Dieser Algorithmus funktioniert nur dann gut, wenn die Anzahl der einzelnen Socken gering ist
quelle
Nimm eine erste Socke und lege sie auf einen Tisch. Wählen Sie jetzt eine andere Socke; Wenn es mit dem zuerst ausgewählten übereinstimmt, legen Sie es auf das erste. Wenn nicht, legen Sie es in geringem Abstand vom ersten auf den Tisch. Wählen Sie eine dritte Socke; Wenn es mit einem der beiden vorherigen übereinstimmt, legen Sie es darauf oder platzieren Sie es in geringem Abstand vom dritten. Wiederholen, bis Sie alle Socken aufgenommen haben.
quelle
Um zu sagen, wie effizient es ist, Socken von einem Stapel zu koppeln, müssen wir zuerst die Maschine definieren, da die Paarung weder durch eine Turing- noch durch eine Direktzugriffsmaschine erfolgt, die normalerweise als Grundlage für eine verwendet wird algorithmische Analyse.
Die Maschine
Die Maschine ist eine Abstraktion eines realen Elements namens Mensch. Es kann mit zwei Augen aus der Umgebung lesen. Und unser Maschinenmodell kann die Umgebung mit zwei Armen manipulieren. Logische und arithmetische Operationen werden mit unserem Gehirn berechnet (hoffentlich ;-)).
Wir müssen auch die intrinsische Laufzeit der atomaren Operationen berücksichtigen, die mit diesen Instrumenten ausgeführt werden können. Aufgrund physikalischer Einschränkungen weisen Operationen, die von einem Arm oder Auge ausgeführt werden, eine nicht konstante zeitliche Komplexität auf. Dies liegt daran, dass wir weder einen endlos großen Stapel Socken mit einem Arm bewegen können, noch ein Auge die obere Socke auf einem endlos großen Stapel Socken sehen kann.
Die mechanische Physik gibt uns jedoch auch einige Vorteile. Wir sind nicht darauf beschränkt, höchstens eine Socke mit einem Arm zu bewegen. Wir können ein paar von ihnen gleichzeitig bewegen.
Abhängig von der vorherigen Analyse sollten daher folgende Operationen in absteigender Reihenfolge verwendet werden:
Wir können auch die Tatsache nutzen, dass Menschen nur eine sehr begrenzte Anzahl von Socken haben. Eine Umgebungsänderung kann also alle Socken im Stapel betreffen.
Der Algorithmus
Also hier ist mein Vorschlag:
Operation 4 ist notwendig, da beim Verteilen von Socken auf dem Boden einige Socken andere verbergen können. Hier ist die Analyse des Algorithmus:
Die Analyse
Der Algorithmus endet mit hoher Wahrscheinlichkeit. Dies liegt an der Tatsache, dass man in Schritt 2 keine Sockenpaare finden kann.
Für die folgende Laufzeitanalyse der Paarung
n
von Sockenpaaren nehmen wir an, dass mindestens die Hälfte der2n
Socken nach Schritt 1 nicht ausgeblendet ist. Im Durchschnitt können wir alson/2
Paare finden . Dies bedeutet, dass die Schleife Schritt 4O(log n)
mal ausgeführt wird. Schritt 2 wirdO(n^2)
mal ausgeführt . Daraus können wir schließen:O(ln n + n)
Umgebungsmodifikationen (Schritt 1O(ln n)
plus Aufnehmen jedes Paar Socken vom Boden)O(n^2)
Umgebungslesungen aus Schritt 2O(n^2)
logische und arithmetische Operationen zum Vergleichen einer Socke mit einer anderen in Schritt 2Wir haben also eine Gesamtkomplexität der Laufzeit,
O(r*n^2 + w*(ln n + n))
wor
undw
sind die Faktoren für Lese- und Schreibvorgänge in der Umgebung für eine angemessene Anzahl von Socken. Die Kosten für die logischen und arithmetischen Operationen entfallen, da wir davon ausgehen, dass eine konstante Anzahl logischer und arithmetischer Operationen erforderlich ist, um zu entscheiden, ob zwei Socken zu demselben Paar gehören. Dies ist möglicherweise nicht in jedem Szenario möglich.quelle
quelle
Ich habe eine andere Lösung herausgebracht, die weder weniger Operationen noch weniger Zeitverbrauch verspricht, aber es sollte versucht werden, herauszufinden, ob sie eine ausreichend gute Heuristik ist, um bei großen Serien von Sockenpaarungen weniger Zeitverbrauch zu erzielen.
Voraussetzungen: Es gibt keine Garantie dafür, dass es die gleichen Socken gibt. Wenn sie dieselbe Farbe haben, bedeutet dies nicht, dass sie dieselbe Größe oder dasselbe Muster haben. Socken werden zufällig gemischt. Es kann eine ungerade Anzahl von Socken geben (einige fehlen, wir wissen nicht wie viele). Bereiten Sie sich darauf vor, sich eine Variable "index" zu merken, und setzen Sie sie auf 0.
Das Ergebnis enthält ein oder zwei Stapel: 1. "übereinstimmend" und 2. "fehlend"
Heuristik:
Es könnte auch eine Überprüfung auf beschädigte Socken hinzugefügt werden, als ob diese entfernt würden. Es könnte zwischen 2 und 3 und zwischen 13 und 14 eingefügt werden.
Ich freue mich auf Erfahrungen oder Korrekturen.
quelle
Wenn ich Socken sortiere, mache ich eine ungefähre Radix-Sortierung und lasse Socken in der Nähe anderer Socken des gleichen Farb- / Mustertyps fallen. Außer in dem Fall, in dem ich eine genaue Übereinstimmung an / in der Nähe des Ortes sehe, an dem ich die Socke fallen lassen werde, extrahiere ich das Paar an diesem Punkt.
Fast alle anderen Algorithmen (einschließlich der Antwort mit der höchsten Punktzahl von usr ) sortieren und entfernen dann Paare. Ich finde, dass es als Mensch besser ist, die Anzahl der Socken zu minimieren, die gleichzeitig in Betracht gezogen werden.
Ich mache das durch:
Dies nutzt die Fähigkeit des Menschen, in O (1) -Zeit Fuzzy-Matches durchzuführen, was in gewisser Weise der Erstellung einer Hash-Map auf einem Computergerät entspricht.
Wenn Sie zuerst an den markanten Socken ziehen, lassen Sie Platz, um die weniger markanten Merkmale zu "zoomen".
Nachdem Sie die Flurofarbe, die Socken mit Streifen und die drei Paar lange Socken entfernt haben, erhalten Sie möglicherweise überwiegend weiße Socken, die grob nach Abnutzung sortiert sind.
Irgendwann sind die Unterschiede zwischen den Socken so gering, dass andere Menschen den Unterschied nicht bemerken, und es sind keine weiteren Anpassungsbemühungen erforderlich.
quelle
Wenn Sie eine Socke aufheben, legen Sie sie an einen Ort. Wenn die nächste Socke, die Sie abholen, nicht zur ersten passt, legen Sie sie neben die erste. Wenn ja, gibt es ein Paar. Auf diese Weise spielt es keine Rolle, wie viele Kombinationen es gibt, und es gibt nur zwei Möglichkeiten für jede Socke, die Sie abholen - entweder hat es eine Übereinstimmung, die bereits in Ihrer Sockenreihe enthalten ist, oder es gibt keine, was bedeutet, dass Sie Fügen Sie es an einer Stelle im Array hinzu.
Dies bedeutet auch, dass Sie mit ziemlicher Sicherheit nie alle Ihre Socken im Array haben werden, da die Socken entfernt werden, wenn sie übereinstimmen.
quelle
Betrachten Sie eine Hash-Tabelle der Größe 'N'.
Wenn wir von einer Normalverteilung ausgehen, ist die geschätzte Anzahl von 'Einfügungen', bei denen mindestens eine Socke einem Eimer zugeordnet ist, NlogN (dh alle Eimer sind voll).
Ich hatte dies als Teil eines anderen Puzzles abgeleitet, würde mich aber freuen, wenn ich mich als falsch erweisen würde. Hier ist mein Blog-Artikel dazu
Lassen Sie 'N' einer ungefähren Obergrenze für die Anzahl der eindeutigen Farben / Muster der Socken entsprechen, die Sie haben.
Sobald Sie eine Kollision haben (auch bekannt als: ein Streichholz), ziehen Sie einfach dieses Paar Socken aus. Wiederholen Sie das gleiche Experiment mit der nächsten Charge von NlogN-Socken. Das Schöne daran ist, dass Sie aufgrund der Funktionsweise des menschlichen Geistes NlogN-Parallelvergleiche (Kollisionsauflösung) durchführen können. :-)
quelle
Socken, ob echte oder eine analoge Datenstruktur, würden paarweise geliefert.
Die einfachste Antwort ist, bevor das Paar getrennt werden kann, sollte eine einzelne Datenstruktur für das Paar initialisiert worden sein, die einen Zeiger auf die linke und rechte Socke enthält, sodass Socken direkt oder über ihr Paar referenziert werden können. Eine Socke kann auch erweitert werden, um einen Zeiger auf ihren Partner zu enthalten.
Dies löst jedes Problem der rechnerischen Paarung, indem es mit einer Abstraktionsebene entfernt wird.
Wenn Sie dieselbe Idee auf das praktische Problem der Paarung von Socken anwenden, lautet die offensichtliche Antwort: Lassen Sie nicht zu, dass Ihre Socken jemals ungepaart werden. Socken werden als Paar geliefert, als Paar in die Schublade gelegt (möglicherweise durch Zusammenballen) und als Paar getragen. Der Punkt, an dem eine Entkopplung möglich ist, befindet sich in der Waschmaschine. Alles, was erforderlich ist, ist ein physikalischer Mechanismus, der es den Socken ermöglicht, zusammen zu bleiben und effizient gewaschen zu werden.
Es gibt zwei physikalische Möglichkeiten:
Für ein 'Paar'-Objekt, das einen Zeiger auf jede Socke hält, könnten wir einen Stoffbeutel haben, mit dem wir die Socken zusammenhalten. Dies scheint ein massiver Overhead zu sein.
Aber damit jede Socke einen Bezug zur anderen hat, gibt es eine gute Lösung: einen Popper (oder einen Schnappknopf, wenn Sie Amerikaner sind), wie diese:
http://www.aliexpress.com/compare/compare-invisible-snap-buttons.html
Dann schnappen Sie Ihre Socken nur noch zusammen, nachdem Sie sie ausgezogen und in Ihren Wäschekorb gelegt haben. Wiederum haben Sie das Problem beseitigt, dass Sie Ihre Socken mit einer physischen Abstraktion des "Paar" -Konzepts kombinieren müssen.
quelle
Wenn die "Verschieben" -Operation ziemlich teuer ist und die "Vergleichen" -Operation billig ist und Sie den gesamten Satz trotzdem in einen Puffer verschieben müssen, in dem die Suche viel schneller ist als im ursprünglichen Speicher ... integrieren Sie einfach die Sortierung in die obligatorische Bewegung.
Ich fand, dass die Integration des Sortierprozesses in das Aufhängen zum Trocknen ein Kinderspiel ist. Ich muss sowieso jede Socke aufheben und sie aufhängen (bewegen) und es kostet mich ungefähr nichts, sie an einer bestimmten Stelle an den Saiten aufzuhängen. Um die Suche nicht nach dem gesamten Puffer (den Zeichenfolgen) zu erzwingen, platziere ich Socken nach Farbe / Farbton. Links dunkler, rechts heller, bunter vorne usw. Bevor ich jetzt jede Socke aufhänge, schaue ich in ihre "rechte Umgebung", ob bereits eine passende vorhanden ist - dies beschränkt den "Scan" auf 2-3 andere Socken - und wenn ja Ich hänge den anderen direkt daneben. Dann rolle ich sie paarweise, während ich sie trocken von den Saiten entferne.
Nun scheint dies nicht allzu verschieden zu sein von "Bilden von Stapeln nach Farbe", wie es in den Top-Antworten vorgeschlagen wird, aber zuerst habe ich kein Problem damit, zu klassifizieren, ob "lila" zu "rotem" oder "blauem" Stapel wird, indem ich keine diskreten Stapel, sondern Bereiche auswähle. es geht einfach dazwischen. Durch die Integration von zwei Vorgängen (zum Trocknen und Sortieren aufhängen) beträgt der Aufwand für das Sortieren beim Aufhängen etwa 10% des separaten Sortieraufwands.
quelle
Ich habe gerade meine Socken gepaart und festgestellt, dass der beste Weg, dies zu tun, der folgende ist:
Im schlimmsten Fall bedeutet dies, dass Sie n / 2 verschiedene Eimer haben und Sie n-2 Bestimmungen darüber haben, welcher Eimer das Paar der aktuellen Socke enthält. Offensichtlich funktioniert dieser Algorithmus gut, wenn Sie nur wenige Paare haben. Ich habe es mit 12 Paaren gemacht.
Es ist nicht so wissenschaftlich, aber es funktioniert gut :)
quelle
Meine Lösung entspricht nicht genau Ihren Anforderungen, wie es formal erforderlich ist
O(n)
"zusätzlichen" Speicherplatz benötigt. In Anbetracht meiner Bedingungen ist es jedoch in meiner praktischen Anwendung sehr effizient. Daher denke ich, dass es interessant sein sollte.Mit anderer Aufgabe kombinieren
Die besondere Bedingung in meinem Fall ist, dass ich keine Trocknungsmaschine benutze, sondern meine Tücher einfach an einen normalen Wäschetrockner hänge. Das Aufhängen von Tüchern erfordert
O(n)
Operationen (ich denke übrigens immer an das Verpacken von Behältern hier das Problem der ), und das Problem erfordert naturgemäß den linearen "zusätzlichen" Raum. Wenn ich eine neue Socke aus dem Eimer nehme, versuche ich, sie neben das Paar zu hängen, wenn das Paar bereits aufgehängt ist. Wenn es eine Socke von einem neuen Paar ist, lasse ich etwas Platz daneben.Oracle Machine ist besser ;-)
Es erfordert offensichtlich einige zusätzliche Arbeit, um zu überprüfen, ob die passende Socke bereits irgendwo hängt, und es würde eine Lösung
O(n^2)
mit einem Koeffizienten1/2
für einen Computer ergeben. Aber in diesem Fall ist der "menschliche Faktor" tatsächlich ein Vorteil - ich kannO(1)
die passende Socke normalerweise sehr schnell (fast ) identifizieren, wenn sie bereits aufgehängt war (wahrscheinlich handelt es sich um ein nicht wahrnehmbares Caching im Gehirn) - betrachten Sie es als eine Art begrenztes "Orakel" wie bei Oracle Machine ;-) Wir, die Menschen, haben diese Vorteile in einigen Fällen gegenüber digitalen Maschinen ;-)Habe es fast
O(n)
!Wenn ich also das Problem des Paarens von Socken mit dem Problem des Aufhängens von Tüchern verbinde, bekomme ich
O(n)
"zusätzlichen Platz" kostenlos und habe eine Lösung, die ungefährO(n)
rechtzeitig ist, nur ein wenig mehr Arbeit erfordert als einfache Hängetücher und den sofortigen Zugriff auf ein komplettes Paar Stoff ermöglicht Socken auch an einem sehr schlechten Montagmorgen ... ;-)quelle
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
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 ():
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 ():
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 ():
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.
quelle
Ich habe einfache Schritte unternommen, um meinen Aufwand auf einen Prozess zu reduzieren, der O (1) Zeit benötigt.
Indem ich meine Eingaben auf eine von zwei Arten von Socken reduziere (weiße Socken zur Erholung, schwarze Socken für die Arbeit), muss ich nur feststellen, welche von zwei Socken ich in der Hand habe. (Technisch gesehen habe ich den Prozess auf O (0) reduziert, da sie nie zusammen gewaschen werden.)
Es sind einige Vorarbeiten erforderlich, um die gewünschten Socken zu finden und in ausreichender Menge zu kaufen, damit Ihre vorhandenen Socken nicht mehr benötigt werden. Da ich dies getan hatte, bevor ich schwarze Socken brauchte, war mein Aufwand minimal, aber die Laufleistung kann variieren.
Eine solche Vorabanstrengung wurde schon oft in sehr populärem und effektivem Code gesehen. Beispiele sind # DEFINE'ing pi auf mehrere Dezimalstellen (es gibt andere Beispiele, aber das ist das, was mir gerade in den Sinn kommt).
quelle
Erstellen Sie eine Hash-Tabelle, die für nicht übereinstimmende Socken verwendet wird, wobei Sie das Muster als Hash verwenden. Iterieren Sie nacheinander über die Socken. Wenn die Socke eine Musterübereinstimmung in der Hash-Tabelle hat, nehmen Sie die Socke aus der Tabelle und machen Sie ein Paar. Wenn die Socke keine Übereinstimmung hat, legen Sie sie in den Tisch.
quelle
Das Problem beim Sortieren Ihrer n Paar Socken ist O (n) . Bevor Sie sie in der Wäsche werfen Korb , fädeln Sie die linke nach rechts ein. Beim Herausnehmen schneiden Sie den Faden ab und legen jedes Paar in Ihre Schublade - 2 Operationen an n Paaren, also O (n).
Jetzt ist die nächste Frage einfach, ob Sie Ihre eigene Wäsche machen und Ihre Frau ihre. Das ist ein Problem, das wahrscheinlich in einem ganz anderen Bereich von Problemen auftritt . :) :)
quelle