Des solutions de tri ont été proposées, mais le triage est un peu trop poussé : Nous n'avons pas besoin d'ordre ; nous avons juste besoin de groupes d'égalité .
Alors hachage serait suffisant (et plus rapide).
- Pour chaque couleur de chaussettes, former une pile . Itérer sur toutes les chaussettes de votre panier d'entrée. et les distribuer sur les piles de couleur .
- Itérer sur chaque pile et le distribuer selon une autre métrique (par exemple, un motif) dans le deuxième ensemble de piles
-
Appliquer récursivement ce schéma jusqu'à ce que vous ayez distribué toutes les chaussettes sur de très petits tas que vous pouvez traiter visuellement immédiatement
Ce type de partitionnement récursif du hachage est en fait effectué par SQL Server lorsqu'il doit effectuer des jointures ou des agrégations par hachage sur d'énormes ensembles de données. Il distribue son flux d'entrée de construction dans de nombreuses partitions qui sont indépendantes. Ce schéma s'adapte linéairement à des quantités arbitraires de données et à plusieurs processeurs.
Vous n'avez pas besoin de partitionnement récursif si vous pouvez trouver une clé de distribution (clé de hachage) qui fournit suffisamment de seaux que chaque seau est assez petit pour être traité très rapidement. Malheureusement, je ne pense pas que les chaussettes aient une telle propriété.
Si chaque chaussette possédait un entier appelé "PairID", on pourrait facilement les répartir dans 10 godets en fonction des critères suivants PairID % 10
(le dernier chiffre).
Le meilleur partitionnement dans le monde réel auquel je peux penser est la création d'une rectangle de pieux : une dimension est la couleur, l'autre est le motif. Pourquoi un rectangle ? Parce que nous avons besoin d'un accès aléatoire O(1) aux piles. (UNE IMAGE 3D cuboïde fonctionnerait également, mais ce n'est pas très pratique).
Mise à jour :
Qu'en est-il parallélisme ? Plusieurs humains peuvent-ils assortir les chaussettes plus rapidement ?
- La stratégie de parallélisation la plus simple consiste à demander à plusieurs travailleurs de prendre dans le panier d'entrée et de mettre les chaussettes sur les piles. Cette stratégie n'a qu'une portée limitée - imaginez 100 personnes se battant pour 10 piles. Les coûts de synchronisation (se manifestant par des collisions de mains et la communication humaine) détruire l'efficacité et la rapidité (voir le Loi universelle d'extensibilité !). Est-ce que cela risque de blocages ? Non, car chaque travailleur n'a besoin d'accéder qu'à une seule pile à la fois. Avec un seul "verrou", il ne peut y avoir d'impasse. Sas d'entrée pourrait être possible selon la façon dont les humains coordonnent l'accès aux piles. Ils pourraient simplement utiliser backoff aléatoire comme les cartes réseau le font au niveau physique pour déterminer quelle carte peut accéder exclusivement au fil du réseau. Si cela fonctionne pour NICs cela devrait fonctionner pour les humains aussi.
- Il s'adapte presque indéfiniment si chaque travailleur a son propre ensemble de piles . Les travailleurs peuvent alors prendre de gros morceaux de chaussettes dans le panier d'entrée (très peu de contention car ils le font rarement) et ils n'ont pas besoin de se synchroniser lors de la distribution des chaussettes (parce qu'ils ont des piles locales). À la fin, tous les travailleurs doivent unir leurs ensembles de piles. Je pense que cela peut être fait en O(log (nombre de travailleurs * piles par travailleur)) si les travailleurs forment une arbre de regroupement .
Qu'en est-il de la le problème de la distinction des éléments ? Comme l'indique l'article, le problème de la distinction des éléments peut être résolu en O(N)
. Il en va de même pour le problème des chaussettes (également O(N)
si vous n'avez besoin que d'une seule étape de distribution (je propose plusieurs étapes uniquement parce que les humains sont mauvais en calcul - une étape est suffisante si vous distribuez sur md5(color, length, pattern, ...)
c'est-à-dire une hachis parfait de tous les attributs)).
Clairement, on ne peut pas aller plus vite que O(N)
donc nous avons atteint le limite inférieure optimale .
Bien que les résultats ne soient pas exactement les mêmes (dans un cas, juste un booléen, dans l'autre cas, les paires de chaussettes), les complexités asymptotiques sont les mêmes.
486 votes
J'utilise le principe du "pigeon hole" pour en associer exactement une de la pile de linge. J'ai 3 couleurs de chaussettes différentes (rouge, bleu et vert) et 2 paires de chaque couleur. Je prends 4 numéros de chaussettes à chaque fois et je fais toujours une paire et je me mets au travail.
2 votes
Je pense qu'on peut simplifier un peu les choses en supposant qu'un certain sous-ensemble de paires de chaussettes est fongible ; j'ai environ six paires de chaussettes qui sont identiques. Par ailleurs, bonne question !
2 votes
Choisissez votre principe d'ordonnancement préféré (couleur, texture, épaisseur), triez-le, choisissez des paires adjacentes.
68 votes
Encore un autre principe de pigeon hole : si vous prenez un sous-ensemble de n/2 +1 chaussettes, il y a doit être au moins une paire dans ce sous-ensemble.
8 votes
De plus, vous écartez les hachages parce que vous ne pouvez pas faire de copies, mais notez qu'il est facilement possible de créer un ensemble de hachages qui n'a pas besoin de copies, tant en informatique qu'en blanchisserie.
3 votes
@MooingDuck : Si vous avez quelque chose de spécifique à l'esprit, veuillez le poster, notez que je ne le "rejette" pas - ce ne sont que mes premières réflexions - cela pourrait être faux, la question elle-même n'interdit pas le hachage, elle exige seulement que l'algorithme soit in-place (et efficace). Comme je l'ai dit, j'apprécierai également une réponse qui traite des autres aspects (petite/grande échelle, et équivalence au problème de la distinction - qui montrera que O(nlogn) est fondamentalement le meilleur que je puisse obtenir sans espace supplémentaire).
7 votes
Remarquez que si vous aviez un nombre infini de paires de chaussettes symétriques différentes (c'est-à-dire gauche=droite), alors, en fait, il est impossible d'en choisir une de chaque, à moins d'accepter l'axiome du choix ( fr.wikipedia.org/wiki/Axiome_de_choix ). Quelle conséquence cela a-t-il sur l'appariement ? En quoi cela est-il pertinent pour la calculabilité ? math.stackexchange.com/questions/269902/
2 votes
D'ailleurs, c'est plus connu (en quelque sorte) comme le jeu du Concentration - en faisant des paires à partir d'un grand groupe aléatoire.
3 votes
Un bon algorithme à faire à la main pourrait être un algorithme de shift-reduce. Ajoutez une nouvelle chaussette à la pile au hasard et dès que vous avez une paire sur le dessus, "réduisez" et enlevez la paire. Finalement, vous obtiendrez la plupart des chaussettes. Le reste peut être traité manuellement ou l'algorithme redémarré. Ce n'est pas du tout de l'informatique, mais c'est assez bon puisque vous pouvez tricher un peu et prendre la bonne chaussette parfois.
42 votes
Grande question ! Vous pourriez être intéressé par mon article sur un problème connexe, qui traite de la probabilité de retirer deux chaussettes assorties de la pile : blogs.msdn.com/b/ericlippert/archive/2010/03/22/
1 votes
Principe du pigeonnier : fr.wikipedia.org/wiki/Pigeonhole_principle
14 votes
Ajouter un pointeur supplémentaire à la classe sock qui pointera vers la paire de sock.
388 votes
Pourquoi ne pas engendrer un enfant et
waitpid
de sorte que, en tant que parent, vous ne triez même pas de chaussettes vous-même ?182 votes
J'ai résolu ce problème en ne possédant que des chaussettes blanches au niveau des genoux. Elles sont toutes assorties. Je peux simplement prendre deux chaussettes au hasard dans la pile et elles sont assorties. Je simplifie encore le problème en n'associant PAS les chaussettes. J'ai un tiroir à chaussettes dans lequel je jette simplement toutes mes chaussettes, sans les assortir. J'en prends deux au hasard dans le tiroir chaque matin. J'ai simplifié le problème à O(0). On ne peut pas faire plus simple que ça :)
17 votes
C'est O(1) de toute façon - il y a une limite constante au nombre de chaussettes qui peuvent entrer dans une machine à laver ou un tiroir à chaussettes particulier.
3 votes
@Steve314 Donc paralléliser et utiliser plusieurs tiroirs à chaussettes.
6 votes
Si vous étiez capable de dupliquer des chaussettes, le "hachage" ne serait pas la réponse la plus efficace ;)
2 votes
Cet article traite d'un problème connexe : citeseerx.ist.psu.edu/viewdoc/
2 votes
Voici un autre lien connexe : mail-archive.com/kragen-tol@canonical.org/msg00084.html
18 votes
Je sais que cela ne répond pas à votre question d'un point de vue théorique, mais d'un point de vue pratique, personne ne regarde vos chaussettes. Ne pas les apparier est O(k).
9 votes
La journée du linge est déjà bien ennuyeuse. Pour éliminer la corvée du tri des chaussettes, vous devriez le faire paresseusement : versez toutes les chaussettes (non assorties) dans le tiroir, chaque matin, choisissez deux chaussettes qui se ressemblent (plus ou moins).
2 votes
Je pense que dans ce cas, l'évitement est la meilleure solution : Je n'ai qu'un seul type de chaussettes et donc c'est O(n) et nécessite un minimum de mémoire... :-)
16 votes
Cette question est pleine d'une vision étroite de l'ingénierie. Tout n'est pas un clou. Le tri des chaussettes de la vie réelle dépend fortement des limites de performance du système cognitif visuel humain et de ses manipulateurs. Nous pouvons, dans une certaine mesure, faire correspondre des chaussettes en utilisant notre traitement parallèle de la vision (cortex visuel FTW). Nous pouvons également, dans une certaine mesure, planifier des mouvements en parallèle avec l'acquisition de la prochaine paire de chaussettes à choisir dans la pile. La description théorique de la complexité algorithmique de la recherche de chaussettes dans la vie réelle n'a rien à voir avec ce que vous décrivez.
11 votes
Autrement dit, le tri des chaussettes dans la vie réelle est totalement insensible à l'algorithme sous-jacent que vous utilisez, et vous ne pouvez pas vraiment choisir un algorithme parce que votre cortex visuel et moteur en a déjà choisi un pour vous. Un algorithme optimal, pour autant que je puisse dire. Le temps de manipulation l'emporte sur tout le reste. Ma conclusion est (et bon sang, j'ai passé quelques heures à m'enregistrer et à analyser les enregistrements) : vous pouvez facilement saturer vos manipulateurs, et c'est tout. Tout ce dont vous avez besoin, c'est d'une table suffisamment grande. Les trucs de CS n'interviennent que si votre charge ne tient pas sur une table.
1 votes
@thang, vous n'avez pas besoin de supposer l'Axiome du choix si le nombre de chaussettes est dénombrable.
1 votes
@ApprenticeQueue disons que tu as raison, à quoi ressemblerait la fonction de choix ? Je pense que vous avez (probablement) tort, mais pour vous donner un indice, regardez ceci : fr.wikipedia.org/wiki/Axiome_de_choix_comptable (une version plus faible de AC). Prouver que même l'axiome du choix dénombrable est indépendant de ZF est difficile et fait appel au forçage.
2 votes
Vous pouvez gagner de la mémoire en plaçant immédiatement la pile du panier dans le tiroir au lieu de l'étaler sur une surface (pour trouver les paires correspondantes). Il suffit de chercher la paire correspondante dans le tiroir lorsque vous en avez besoin.
12 votes
Je suis sûr que quelqu'un l'a déjà dit, mais vous partez de l'hypothèse incorrecte qu'il y a une paire pour chaque chaussette. Je veux dire - allez, vous pensez vraiment que chaque chaussette que vous lavez a une paire assortie...
4 votes
La solution optimale au problème des paires de chaussettes est de les mettre à la blanchisserie. en paire . Cela réduit le temps de tri à zéro et résout le problème de la chaussette unique.
1 votes
@amit tu as écrit qu'en utilisant ta technique naïve tu faisais Cela nécessite d'itérer sur n/2 * n/4 = n2/8 chaussettes en moyenne. . Quel est le raisonnement qui sous-tend cette décision ? Comment apparaissent les termes n/2 et n/4 ?
1 votes
@Geek Vous devez apparier n/2 chaussettes (d'où l'origine de n/2). en prenant une chaussette, et en trouvant sa correspondance. En moyenne, vous devez passer par la moitié des chaussettes restantes. À la première itération, ce nombre est n/2, à la deuxième, (n/2)/2, ... la moyenne de n/2,(n-2)/2,(n-4)/2, ...,2/2 est n/4.
4 votes
L'autre problème que tout le monde semble avoir négligé est celui de trouver la chaussette qui correspond exactement à la chaussette (pas seulement la même couleur et la même taille). Je garde toujours les chaussettes avec leurs partenaires respectifs pour qu'elles se portent de la même façon, donc si je ne trouve pas la chaussette exacte que j'ai toujours portée avec l'autre chaussette, elles seront différentes (inacceptables pour mon esprit de programmeur TOC) même si elles proviennent du même exactement le même paquet .
7 votes
J'ai également résolu le problème pratique en O(1) temps, en achetant uniquement des chaussettes noires par paquets de 50 paires. Il est intéressant de voir combien de posters de Stack Overflow ont trouvé la même solution !
5 votes
Comment expliquer la chaussette sans sa paire que le monstre du sèche-linge a mangée ?
1 votes
Pour les chaussettes, je pense qu'un tri par seau serait la méthode la plus efficace. placez votre pile à un endroit et vos seaux à un autre. tirez une chaussette, mettez-la dans une nouvelle pile de chaussettes correspondant à cette chaussette. tant que vous disposez d'un espace de table suffisant, vous pouvez trier vos chaussettes en O(n) temps, qui est la limite inférieure, si vous le faites vous-même. l'ajout de travailleurs supplémentaires vous permet de pousser vers O(log n)
1 votes
Votre hypothèse sur les paires assorties est tellement éloignée de la réalité. même avec deux
parallel.task(child).waitpid.all
le gain de performance que promet la réponse acceptée est annulé par le déclin exponentiel du nombre de spécimens correspondants dans la pile au fil du temps.1 votes
Étape 1) Jetez toutes vos chaussettes actuelles. Étape 2 : achetez 15 paires de chaussettes noires identiques pour vous-même, et 15 paires de chaussettes blanches identiques pour votre femme. Étape 3) L'algorithme indique : "Les chaussettes noires sont les vôtres, et les chaussettes blanches sont celles de votre femme" !
1 votes
Grande question !
1 votes
@Mxyk J'ai un peu peur de demander, pourquoi vos enfants meurent-ils lorsqu'ils ont fini de fouiller les chaussettes ? Cela semble sous-optimal (et cruel).
0 votes
Peut-être que vous devez trier le tableau des chaussettes les premières à atteindre de telles vitesses.