[EDIT: descargo de responsabilidad! Yo probablemente no debería haber publicado esta respuesta, porque no está en ninguna parte cerca de mi área de especialización, así que ten cuidado, puede contener una tontería!]
[EDIT: lo siento, vi a este problema en un libro, pero me parece un buen algoritmo determinista en $O(n (\log n)^4)$ tiempo fue encontrado más tarde, por lo que esta respuesta es inaplicable; referencia:
La coincidencia de las tuercas y los tornillos por Noga Alon, Manuel Blum, Amos Fiat, Sampath Kannan, Moni Naor, Rafail Ostrovsky;
citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.103
]
Las "tuercas y tornillos" problema, y yo la vi hace apenas unos días en el Algoritmo Manual de Diseño [referencia precisa a seguir cuando tengo tiempo para editar]:
Se le da $n$ pares de tuercas y tornillos, todo muy ligeramente diferentes tamaños (por lo tanto, cada tuerca de ajuste exactamente a un tornillo), pero por desgracia todos ellos han sido desmontado, y usted tiene que adaptarse a ellos juntos.
Usted no puede ver la diferencia en el tamaño de los ojos, así que la única manera de ver si una tuerca se ajusta un tornillo es intentarlo. Si la tuerca es demasiado grande o pequeño para un perno, usted descubrirá este; pero tenga en cuenta que no se puede comparar dos tuercas, o dos tornillos, uno con el otro directamente.
De manera abstracta: tenemos 2 real secuencias desconocidas $(x_1, x_2, \ldots, x_n)$ e $(y_1, y_2, \ldots, y_n)$.
El $x_i$ son todos distintos, y $(y_j)$ es un desconocido reordenamiento de $(x_i)$. Queremos coincidir con ellos, pero la ÚNICA medida que podemos hacer es recoger $i,j$ y compare $x_i$ con $y_j$.
La obvia algoritmo de tratar de todos ellos, uno por uno, se lleva a $O(n^2)$ del tiempo.
Sin embargo, una variante de aleatorizado quicksort tarda $O(n \log n)$ en promedio. La aleatoriedad sólo viene de recoger cada tuerca/tornillo al azar.
Detalles: escoge una tuerca, usar eso como el elemento pivote para los pernos; a continuación, utilice la coincidencia de tornillo como el elemento pivote para los frutos secos, etc. - como quicksort, pero ir hacia adelante y hacia atrás entre el $x$ e $y$ elementos.