Frage Wie Socken effizient von einem Stapel zu paaren?


Gestern habe ich die Socken aus der sauberen Wäsche gepaart und herausgefunden, dass es nicht sehr effizient ist. Ich machte eine naive Suche - eine Socke pflückend und den Haufen "iterierend", um sein Paar zu finden. Dies erfordert eine Iteration über n / 2 * n / 4 = n2/ 8 Socken im Durchschnitt.

Als Informatiker habe ich überlegt, was ich tun könnte? Sortierung (nach Größe / Farbe / ...) kam natürlich in den Sinn, um eine O (NlogN) -Lösung zu erreichen.

Hashing oder andere nicht-vorhandene Lösungen sind keine Option, da ich meine Socken nicht duplizieren kann (obwohl es nett sein könnte, wenn ich könnte).

Also, die Frage ist im Grunde:

Angesichts eines Stapels von n Sockenpaare, die enthalten 2n Elemente (angenommen, jede Socke hat genau ein passendes Paar), was ist der beste Weg, sie effizient mit bis zu logarithmischem Extraraum zu paaren? (Ich glaube, ich kann mich bei Bedarf an diese Menge an Informationen erinnern.)

Ich werde eine Antwort schätzen, die die folgenden Aspekte anspricht:

  • Ein General theoretisch Lösung für eine große Anzahl von Socken.
  • Die tatsächliche Anzahl der Socken ist nicht so groß, ich glaube nicht, dass mein Ehepartner und ich mehr als 30 Paare haben. (Und es ist ziemlich leicht, zwischen meinen und ihren Socken zu unterscheiden; kann man das auch benutzen?)
  • Ist es gleichbedeutend mit dem Elementunterscheidbarkeitsproblem?

3501
2018-01-19 15:34


Ursprung


Antworten:


Sortierlösungen wurden vorgeschlagen, aber Sortieren ist ein bisschen zu viel: Wir brauchen keine Ordnung; Wir brauchen nur Gleichstellungsgruppen.

Damit Hashing wäre genug (und schneller).

  1. Für jede Sockenfarbe, einen Haufen bilden. Iteriere über alle Socken in deinem Eingabekorb und verteilen Sie sie auf den Farbstapeln.
  2. Iteriere über jeden Stapel und verteile es nach einer anderen Metrik (z. B. Muster) in den zweiten Satz von Pfählen
  3. Wenden Sie dieses Schema rekursiv an bis du alle Socken verteilt hast sehr kleine Stapel, die Sie sofort visuell bearbeiten können

Diese Art von rekursiver Hash-Partitionierung wird tatsächlich von SQL Server wenn es Hash-Joins oder Hash-Aggregate über große Datenmengen benötigt. Er verteilt seinen Build-Eingangsstrom in viele unabhängige Partitionen. Dieses Schema skaliert auf beliebige Datenmengen und mehrere CPUs linear.

Sie benötigen keine rekursive Partitionierung, wenn Sie einen Verteilungsschlüssel (Hash-Schlüssel) finden stellt genug Eimer zur Verfügung dass jeder Eimer 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 verteilen PairID % 10 (die letzte Ziffer)

Die beste reale Partitionierung, die ich mir vorstellen kann, ist die Erstellung eines Rechteck von Pfählen: Eine Dimension ist Farbe, die andere ist das Muster. Warum ein Rechteck? Weil wir O (1) Random-Access zu Pfählen benötigen. (Ein 3D Quader würde auch funktionieren, aber das ist nicht sehr praktisch.)


Aktualisieren:

Wie wäre es mit Parallelität? Können mehrere Menschen die Socken schneller aufeinander abstimmen?

  1. Die einfachste Parallelisierungsstrategie besteht darin, dass mehrere Arbeiter den Eingabekorb entnehmen und die Socken auf die Stapel legen. Das erhöht sich nur so sehr - stellen Sie sich 100 Menschen vor, die über 10 Haufen kämpfen. Die Synchronisationskosten (manifestiert sich als Handkollisionen und menschliche Kommunikation) Zerstöre Effizienz und Beschleunigung (siehe Universelles Skalierbarkeitsgesetz!). Ist das anfällig für? Deadlocks? Nein, weil jeder Arbeiter nur auf einen Stapel gleichzeitig zugreifen muss. Mit nur einer "Sperre" kann es nicht zu einem Deadlock kommen. Livelocks könnte abhängig davon sein, wie die Menschen den Zugang zu Pfählen koordinieren. Sie könnten einfach verwenden zufälliger Backoff Wie Netzwerkkarten tun dies auf einer physischen Ebene, um zu bestimmen, welche Karte exklusiv auf die Netzwerkleitung zugreifen kann. Wenn es funktioniert für Netzwerkkartensollte es auch für Menschen funktionieren.
  2. Es skaliert fast unbegrenzt wenn Jeder Arbeiter hat seine eigenen Stapel. Arbeiter können dann große Stücke Socken aus dem Eingabekorb nehmen (sehr wenig Streit, da sie es selten tun) und sie müssen nicht synchronisieren, wenn sie die Socken verteilen (weil sie Thread-lokale Stapel haben). Am Ende müssen alle Arbeiter ihre Pfähle zusammenfügen. Ich glaube, das kann in O (log (Arbeiteranzahl * Haufen pro Arbeiter)) gemacht werden, wenn die Arbeiter eine Aggregationsbaum.

Was ist mit Elementunterscheidbarkeitsproblem? Wie der Artikel sagt, kann das Problem der Unterscheidbarkeit von Elementen gelöst werden O(N). Das gleiche gilt für das Sockenproblem (auch O(N), wenn Sie nur einen Verteilungsschritt benötigen (Ich habe mehrere Schritte nur vorgeschlagen, weil Menschen schlecht in Berechnungen sind - ein Schritt ist genug, wenn Sie auf verteilen md5(color, length, pattern, ...), d perfekter Hash aller Attribute)).

Natürlich kann man nicht schneller gehen als O(N)So haben wir das erreicht optimale untere Grenze.

Obwohl die Ausgaben nicht genau gleich sind (in einem Fall nur ein boolescher Wert. Im anderen Fall die Sockenpaare), sind die asymptotischen Komplexitäten gleich.


2176
2017-10-19 20:47



Da die Architektur des menschlichen Gehirns völlig anders ist als eine moderne CPU, hat diese Frage keinen praktischen Sinn.

Menschen können CPU-Algorithmen mit der Tatsache gewinnen, dass "ein passendes Paar finden" eine Operation für ein Set sein kann, das nicht zu groß ist.

Mein Algorithmus:

spread_all_socks_on_flat_surface();
while (socks_left_on_a_surface()) {
     // Thanks to human visual SIMD, this is one, quick operation.
     pair = notice_any_matching_pair();
     remove_socks_pair_from_surface(pair);
}

Zumindest benutze ich das im wirklichen Leben, und ich finde es sehr effizient. Der Nachteil ist, dass es eine flache Oberfläche erfordert, aber es ist normalerweise reichlich vorhanden.


522
2018-05-27 19:13



Fall 1: Alle Socken sind identisch (das mache ich übrigens im wirklichen Leben).

Wählen Sie zwei von ihnen, um ein Paar zu machen. Konstante Zeit.

Fall 2: Es gibt eine konstante Anzahl von Kombinationen (Besitz, Farbe, Größe, Textur usw.).

Benutzen Radix sortieren. Dies ist nur eine lineare Zeit, da ein Vergleich nicht erforderlich ist.

Fall 3: Die Anzahl der Kombinationen ist nicht im Voraus bekannt (allgemeiner Fall).

Wir müssen vergleichen, ob zwei Socken paarweise kommen. Wähle eines der O(n log n) Vergleichsbasierte Sortieralgorithmen.

Im wirklichen Leben jedoch, wenn die Anzahl der Socken relativ klein (konstant) ist, würden diese theoretisch optimalen Algorithmen nicht gut funktionieren. Es könnte sogar noch länger dauern als die sequentielle Suche, die theoretisch eine quadratische Zeit benötigt.


231



Nicht algorithmische Antwort, aber "effizient", wenn ich es tue:

  • Schritt 1) ​​verwerfen Sie alle vorhandenen Socken

  • Schritt 2) gehe zu Walmart und kaufe sie durch Pakete von 10 - n Paket von weiße und m schwarze Pakete. Keine Notwendigkeit für andere Farben im Alltag Leben.

Aber manchmal muss ich das wieder machen (verlorene Socken, beschädigte Socken, etc.), und ich hasse es, sehr gute Socken zu oft zu verwerfen (und ich wünschte, sie verkauften immer die gleiche Sockenreferenz!), Also nahm ich vor kurzem Ein anderer Versuch.

Algorithmische Antwort:

Bedenke, als ob du nur eine Socke für den zweiten Sockenstapel zeichnest, da deine Chancen, bei einer naiven Suche die passende Socke zu finden, ziemlich niedrig sind.

  • Also nimm fünf von ihnen zufällig auf und merke dir ihre Form oder ihre Länge.

Warum fünf? Normalerweise erinnern sich die Menschen gut an fünf bis sieben verschiedene Elemente im Arbeitsgedächtnis - ein bisschen wie das menschliche Äquivalent von a RPN Stapel - Fünf ist ein sicherer Standard.

  • Nimm einen aus dem Stapel von 2n-5.

  • Suchen Sie nun nach einer Übereinstimmung (visuelle Mustererkennung - Menschen sind gut darin mit einem kleinen Stapel) innerhalb der fünf, die Sie gezeichnet haben, wenn Sie keine finden, dann fügen Sie diese zu Ihren fünf hinzu.

  • Wähle zufällig Socken aus dem Stapel und vergleiche deine 5 + 1 Socken für ein Spiel. Wenn Ihr Stack wächst, wird es Ihre Leistung verringern, aber Ihre Chancen erhöhen. Viel schneller.

Fühlen Sie sich frei, die Formel aufzuschreiben, um zu berechnen, wie viele Stichproben Sie für eine Quote von 50% eines Spiels ziehen müssen. IIRC ist ein hypergeometrisches Gesetz.

Das mache ich jeden Morgen und brauche selten mehr als drei Remis - aber ich habe n ähnliche Paare (um 10, geben oder nehmen die Verlorenen) von m geformte weiße Socken. Jetzt kannst du die Größe meines Stapelstapels schätzen :-)

ÜbrigensIch fand heraus, dass die Summe der Transaktionskosten für das Sortieren aller Socken jedes Mal, wenn ich ein Paar brauchte, viel geringer war, als wenn ich es einmal getan und die Socken gebunden hätte. Ein Just-in-Time funktioniert besser, weil man dann die Socken nicht binden muss, und es gibt auch einen abnehmenden Grenzertrag (das heißt, du suchst nach den zwei oder drei Socken, die irgendwo in der Wäscherei sind und die du brauchst um deine Socken zu vervollständigen und du verlierst die Zeit dafür).


144



Was ich mache ist, dass ich die erste Socke aufhebe und sie ablege (sagen wir, am Rand der Waschschüssel). Dann hebe ich eine andere Socke auf und prüfe, ob sie mit der ersten Socke übereinstimmt. Wenn es ist, entferne ich sie beide. Wenn nicht, lege ich es neben die erste Socke. Dann nehme ich die dritte Socke und vergleiche das mit den ersten beiden (wenn sie noch da sind). Etc.

Dieser Ansatz kann ziemlich einfach in einem Array implementiert werden, wenn man davon ausgeht, 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 mit einem Array enden, in dem alle Socken paarweise im Array angeordnet sind.

Unter der Annahme, dass die einzige Operation für Socken darin besteht, nach Gleichheit zu vergleichen, ist dieser Algorithmus grundsätzlich immer noch ein n2 Algorithmus, obwohl ich nicht über den durchschnittlichen Fall weiß (nie gelernt, das zu berechnen).

Sortierung verbessert natürlich die Effizienz, besonders im wirklichen Leben, wo Sie eine Socke zwischen zwei anderen Socken leicht "einfügen" können. Bei der Berechnung könnte dasselbe 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 Sortierungskriterien gleich sind, aber nicht aus demselben Paar).

Ansonsten kann ich an nichts denken, aber diese Methode scheint im wirklichen Leben ziemlich effizient zu sein. :)


92



Dies ist die falsche Frage. Die richtige Frage ist, warum sortiere ich Socken? Wie viel kostet es jährlich, wenn Sie Ihre Freizeit für X Geldeinheiten Ihrer Wahl schätzen?

Und meistens nicht nur irgendein Freizeit, ist es Morgen Freizeit, die Sie im Bett verbringen könnten, oder Ihren Kaffee schlürfen, oder etwas früh verlassen und nicht im Verkehr gefangen werden.

Es ist oft gut, einen Schritt zurück zu machen und über das Problem nachzudenken.

Und es gibt einen Weg!

Finde eine Socke, die dir gefällt. Berücksichtigen Sie alle relevanten Merkmale: Farbe bei unterschiedlichen Lichtverhältnissen, Gesamtqualität und Haltbarkeit, Komfort bei unterschiedlichen klimatischen Bedingungen und Geruchsabsorption. Wichtig ist auch, dass sie bei der Lagerung keine Elastizität verlieren sollten, so dass natürliche Stoffe gut sind, und sie sollten in einer Plastikhülle erhältlich sein.

Es ist besser, wenn es keinen Unterschied zwischen den linken und rechten Socken gibt, aber das ist nicht kritisch. Wenn die Socken links-rechts symmetrisch sind, ist das Finden eines Paares O (1), und das Sortieren der Socken ist eine ungefähre O (M) Operation, wobei M die Anzahl der Plätze in Ihrem Haus ist, die Sie mit Socken übersät haben, im Idealfall einige kleine konstante Zahl.

Wenn Sie ein schickes Paar mit unterschiedlicher linker und rechter Socke wählen, nehmen Sie eine volle Eimersortierung nach links und rechts, nehmen Sie O (N + M), wobei N die Anzahl der Socken ist und M wie oben ist. Jemand anders kann die Formel für durchschnittliche Iterationen des Findens des ersten Paares geben, aber der ungünstigste Fall für das Finden eines Paares mit Blindsuche ist N / 2 + 1, was bei vernünftigem N astronomisch unwahrscheinlich wird. Dies kann durch Verwendung eines fortgeschrittenen Bildes beschleunigt werden Erkennungsalgorithmen und Heuristiken beim Scannen des Stapels unsortierter Socken mit Mk1 Augapfel.

Ein Algorithmus zum Erzielen einer O (1) Sockenpaarungseffizienz (unter der Annahme einer symmetrischen Socke) ist also:

  1. Sie müssen abschätzen, wie viele Sockenpaare Sie für den Rest Ihres Lebens benötigen oder bis Sie in den Ruhestand gehen und in wärmere Klimazonen ziehen, ohne dass Sie jemals wieder Socken tragen müssen. Wenn Sie jung sind, können Sie auch abschätzen, wie lange es dauert, bis wir alle Sockensortierroboter in unseren Häusern haben, und das ganze Problem wird irrelevant.

  2. Sie müssen herausfinden, wie Sie Ihre ausgewählte Socke in großen Mengen bestellen können und wie viel sie kostet, und liefern sie.

  3. Bestelle die Socken!

  4. Befreie deine alten Socken.

Ein alternativer Schritt 3 würde beinhalten, die Kosten für den Kauf der gleichen Anzahl von vielleicht billigeren Socken über die Jahre hinweg paarweise zu vergleichen und die Kosten für das Sortieren der Socken zu addieren, aber nehmen Sie mein Wort: der Einkauf in großen Mengen ist billiger! Auch Socken im Speicher steigen im Wert der Aktienpreisinflation, was mehr ist als bei vielen Investitionen. Dann wieder gibt es auch Lagerkosten, aber Socken nehmen wirklich nicht viel Platz auf dem obersten Regal eines Schrankes.

Problem gelöst. Also, hol dir einfach neue Socken, wirf deine alten weg und lebe glücklich, bis du weißt, dass du jeden Tag Geld und Zeit für den Rest deines Lebens sparst.


50



Das theoretische Limit ist O (n), weil Sie jede Socke berühren müssen (es sei denn, einige sind bereits irgendwie gepaart).

Sie können O (n) mit erreichen Radix sortieren. Sie müssen nur einige Attribute für die Eimer auswählen.

  1. Zuerst kannst du wählen (ihre, meine) - teile sie in 2 Haufen,
  2. dann verwende Farben (kann jede Reihenfolge für die Farben haben, zum Beispiel alphabetisch nach Farbnamen) - teile sie in Stapel nach Farben (denk daran, die erste Reihenfolge von Schritt 1 für alle Socken im selben Stapel beizubehalten),
  3. dann Länge der Socke,
  4. dann Textur, ....

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) ausgeführt werden, was O (n) ist, wenn wir betrachten können, dass k begrenzt ist.


47



Als praktische Lösung:

  1. Machen Sie schnell Stapel von leicht unterscheidbaren Socken. (Sprich nach Farbe)
  2. Quicksort jeden Stapel und verwenden Sie die Länge der Socke zum Vergleich. Als ein Mensch können Sie eine ziemlich schnelle Entscheidung treffen, welche Socke zur Partitionierung zu verwenden ist, die den schlimmsten Fall vermeidet. (Sie können mehrere Socken parallel sehen, nutzen Sie das zu Ihrem Vorteil!)
  3. Hören Sie auf, Stapel zu sortieren, wenn sie einen Schwellenwert erreicht haben, bei dem Sie sofort Punktepaare und nicht vermeidbare Socken finden können

Wenn Sie 1000 Socken haben, mit 8 Farben und einer durchschnittlichen Verteilung, können Sie 4 Stapel von 125 Socken in c * n Zeit machen. Mit einer Schwelle von 5 Socken können Sie jeden Stapel in 6 Läufen sortieren. (Zählt man 2 Sekunden, um eine Socke auf den rechten Stapel zu werfen, dauert es weniger als 4 Stunden.)

Wenn du nur 60 Socken, 3 Farben und 2 Socken hast (deine / deine Frau), kannst du jeden Stapel von 10 Socken in 1 Läufen sortieren (Wiederschwelle = 5). (Zählen 2 Sekunden dauert es 2 Minuten).

Die anfängliche Eimer Sortierung wird Ihren Prozess beschleunigen, da es Ihre n Socken in k Eimer unterteilt c*n Zeit so, als Sie nur tun müssen c*n*log(k) Arbeit. (Nicht unter Berücksichtigung der Schwelle). Also alles in allem machst du ungefähr n*c*(1 + log(k)) Arbeit, wo c ist die Zeit, eine Socke auf einen Haufen zu werfen.

Dieser Ansatz wird im Vergleich zu jedem anderen Ansatz günstig sein c*x*n + O(1) Methode ungefähr so ​​lang wie log(k) < x - 1.


In der Informatik kann dies hilfreich sein: Wir haben eine Sammlung von n Dinge, eine Reihenfolge auf ihnen (Länge) und auch eine Äquivalenzbeziehung (zusätzliche Informationen, zum Beispiel die Farbe der Socken). Die Äquivalenzrelation ermöglicht uns, eine Partition der ursprünglichen Sammlung zu erstellen, und in jeder Äquivalenzklasse wird unsere Reihenfolge beibehalten. Das Mapping von a Ding Zu seiner Äquivalenzklasse kann in O (1) getan werden, so dass nur O (n) benötigt wird, um jedes Element einer Klasse zuzuordnen. Jetzt haben wir unsere zusätzlichen Informationen verwendet und können in irgendeiner Weise vorgehen, um jede Klasse zu sortieren. Der Vorteil ist, dass die Datensätze bereits deutlich kleiner sind.

Die Methode kann auch geschachtelt werden, wenn wir mehrere Äquivalenzrelationen haben -> Farbstapel erstellen, als innerhalb jeder Stapelpartition auf Textur, als nach Länge sortieren. Jede Äquivalenzrelation, die eine Partition mit mehr als 2 Elementen mit ungefähr gerader Größe erzeugt, bringt eine Geschwindigkeitsverbesserung gegenüber der Sortierung (vorausgesetzt, wir können dem Stapel direkt eine Socke zuweisen), und die Sortierung kann bei kleineren Datensätzen sehr schnell erfolgen.


31



Diese Frage ist tatsächlich zutiefst philosophisch. Im Grunde geht es darum, ob die Macht der Menschen, Probleme zu lösen (die "Wetware" unseres Gehirns), dem entspricht, was mit Algorithmen erreicht werden kann.

Ein naheliegender Algorithmus zur Sockensortierung ist:

Let N be the set of socks that are still unpaired, initially empty
for each sock s taken from the dryer
  if s matches a sock t in N
    remove t from N, bundle s and t together, and throw them in the basket
  else
    add s to N

Jetzt dreht sich die Informatik in diesem Problem um die Schritte

  1. "Wenn s mit einer Socke t in N ist". Wie schnell können wir uns an das erinnern, was wir bisher gesehen haben?
  2. "entferne t von N" und "addiere s zu N". Wie teuer ist das, was wir bisher gesehen haben?

Menschen werden verschiedene Strategien anwenden, um diese zu bewirken. Menschliche Erinnerung ist assoziativähnlich einer Hash-Tabelle, in der Feature-Sets von gespeicherten Werten mit den entsprechenden Werten selbst gepaart sind. Zum Beispiel ist das Konzept des "roten Autos" auf alle roten Autos abgebildet, an die sich eine Person erinnern kann. Jemand mit einem perfekten Gedächtnis hat eine perfekte Zuordnung. Die meisten Menschen sind in dieser Hinsicht (und den meisten anderen) unvollkommen. Die assoziative Karte hat eine begrenzte Kapazität. Mappings können piepsen unter verschiedenen Umständen (ein Bier zu viel) existent sein, falsch aufgezeichnet werden ("Ich war ihr Name Betty, nicht Nettie"), oder nie überschrieben werden, obwohl wir beobachten, dass sich die Wahrheit geändert hat ("Papas Auto") "Orange Firebird", als wir wussten, dass er das für den roten Camaro eingetauscht hatte).

Bei Socken bedeutet perfekte Erinnerung, dass man eine Socke betrachtet s produziert immer die Erinnerung an seine Geschwister t, einschließlich genügend Informationen (wo es auf dem Bügelbrett ist) zu lokalisieren t in konstanter Zeit. Eine Person mit fotografischem Gedächtnis führt sowohl 1 als auch 2 in konstanter Zeit ohne Fehler durch.

Jemand mit weniger als perfektem Gedächtnis könnte einige Äquivalenzklassen für den gesunden Menschenverstand verwenden, die auf Merkmalen basieren, die in seiner Fähigkeit zu verfolgen sind: Größe (Papa, Mama, Baby), Farbe (grünlich, rötlich usw.), Muster (argyle, plain usw.) , Stil (Footie, Kniehöhe, etc.). So würde das Bügelbrett in Abschnitte für die Kategorien unterteilt werden. Dies erlaubt normalerweise, dass die Kategorie in konstanter Zeit nach Speicher lokalisiert wird, aber dann wird eine lineare Suche durch die Kategorie "Bucket" benötigt.

Jemand, der keine Erinnerung oder Vorstellungskraft hat (Entschuldigung), wird nur die Socken in einem Stapel halten und den gesamten Stapel linear durchsuchen.

Ein ordentlicher Freak könnte numerische Bezeichnungen für Paare verwenden, wie jemand vorgeschlagen hat. Dies öffnet die Tür zu einer Gesamtordnung, die es dem Menschen erlaubt, genau die gleichen Algorithmen zu verwenden, die wir mit einer CPU verwenden könnten: binäre Suche, Bäume, Hashes, etc.

Der "beste" Algorithmus hängt also von den Eigenschaften der Wetware / Hardware / Software ab, die ihn ausführt, und von unserer Bereitschaft, "zu schummeln", indem eine Gesamtbestellung auf Paare angewendet wird. Sicherlich ein "Bestes" MetaAlgorithmus ist, den besten Sockensortierer der Welt anzuheuern: eine Person oder Maschine, die ein riesiges Set N von Sockenattributsätzen in einem Assoziativspeicher 1-1 mit konstantem Nachschlagen, Einfügen und Löschen aufnehmen und schnell speichern kann. Sowohl Menschen als auch Maschinen können beschafft werden. Wenn Sie einen haben, können Sie alle Socken in O (N) Zeit für N Paare paaren, was optimal ist. Die Gesamtzahl der Auftrags-Tags ermöglicht es Ihnen, Standard-Hashing zu verwenden, um entweder mit einem menschlichen oder einem Hardware-Computer das gleiche Ergebnis zu erhalten.


25



Sie versuchen, das falsche Problem zu lösen.

Lösung 1: Jedes Mal, wenn Sie schmutzige Socken in Ihren Wäschekorb legen, binden Sie sie in einen kleinen Knoten. So müssen Sie nach dem Waschen nicht sortieren. Stellen Sie sich vor, Sie könnten einen Index in einer Mongo-Datenbank registrieren. Ein wenig Arbeit 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: Verbreiten Sie die Arbeit. Sie möchten einen solchen komplexen CPU-Prozess asynchron ausführen, ohne die Benutzeroberfläche zu blockieren. Nimm diesen Haufen Socken und stopfe sie in eine Tüte. Suchen Sie nur nach einem Paar, wenn Sie es brauchen. Auf diese Weise ist der Arbeitsaufwand viel weniger spürbar.

Hoffe das hilft!


23



Hier ist eine Omega (n log n) Untergrenze im Vergleichsbasierten Modell. (Die einzige gültige Operation ist der Vergleich zweier Socken.)

Angenommen, Sie kennt dass deine 2n Socken so angeordnet sind:

p1 p2 p3 ... pn pf (1) pf (2) ... pf (n)

wobei f eine unbekannte Permutation der Menge {1,2, ..., n} ist. Das zu wissen kann das Problem nicht erschweren. Es gibt n! mögliche Ausgaben (Übereinstimmungen zwischen der ersten und zweiten Hälfte), was bedeutet, dass Sie log (n!) = Omega (n log n) Vergleiche benötigen. Dies ist durch Sortieren erreichbar.

Da Sie an Verbindungen zum Elementunterscheidbarkeitsproblem interessiert sind, ist es schwieriger, das für die Unterscheidbarkeit von Elementen gebundene Omega (n log n) zu beweisen, da die Ausgabe binär ja / nein ist. Hier muss die Ausgabe ein Matching sein und die Anzahl der möglichen Ausgaben reicht aus, um eine ordentliche Grenze zu bekommen. 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 durch Senden (a1, ein2, ..., einn) zu einem1, ein1, ein2, ein2, ..., einn, einn). (Nebenbei, der Beweis der Härte von ED ist sehr interessant, über Topologie.)

Ich denke, dass es ein Omega geben sollte (n2) gebunden an das ursprüngliche Problem, wenn Sie nur Gleichheitsprüfungen zulassen. Meine Intuition ist: Betrachten Sie ein Diagramm, in dem Sie nach einem Test eine Kante hinzufügen, und argumentieren Sie, dass die Ausgabe nicht eindeutig bestimmt ist, wenn das Diagramm nicht dicht ist.


20