¿Cuál es el mejor algoritmo de clasificación manual? Por ejemplo, si tuviera una pila de papeles que quisiera ordenar alfabéticamente, ¿cuál sería la forma más eficiente de hacerlo? ¿Qué pasaría si estuvieras de acuerdo con que uno o dos se alejen de su posición ordenada?

Lekan mencionó un punto interesante de diferencia entre la clasificación humana y la clasificación algorítmica, que es que las computadoras pueden abordar fácilmente el “elemento de matriz i” mientras que los humanos no son tan buenos (aunque yo diría que podemos hacerlo en un tiempo de sub-registro).

Sin embargo, otro punto clave de diferencia que creo que es muy importante en la vida real es que los objetos contiguos se pueden desplazar sin costo lineal (hasta cierto punto, por supuesto). Por ejemplo, si ejecuto “ordenar por inserción” yo mismo, vería que me desempeño mejor que [math] O (n log_2 n) [/ math], y ciertamente mejor que [math] O (n ^ 2) [/ matemáticas] sugerido por el algoritmo. Y, de hecho, la ordenación por inserción es cómo clasifico los documentos manualmente, aunque a menudo los agrupo primero (según la distribución), como por la primera letra alfabética, según la cantidad de papeles que necesito clasificar.

¿Cómo funciona el “ordenamiento por inserción” para un humano? Tengo dos pilas, una pila sin clasificar y una pila ordenada. En cada iteración, elijo el elemento superior de la pila sin clasificar, y lo inserto en la posición correcta en la pila ordenada. Encontrar la posición correcta es, en el peor de los casos, [math] log_2 k [/ math] (donde [math] k [/ math] es el número de elementos ordenados) si hago el equivalente a la búsqueda binaria en la pila ordenada; en realidad, generalmente recuerdo aproximadamente dónde pertenece cada objeto en la lista ordenada porque realizo un bucket hasta que tengo menos de 100 objetos, por lo que el tiempo de búsqueda es sublogarítmico en promedio. Luego, insertar el papel en el lugar correcto es tiempo constante. Por lo tanto, cada iteración cuesta [matemática] log_2 k [/ matemática], para un total de [matemática] \ sum_ {i} ^ {n} {log_ {2} {i}} [/ matemática] busca y [matemática] n [ / math] inserta, que es [math] O (n log_2 n) [/ math].

Me pregunto si la capacidad de insertar sin costo puede permitirme aprovechar un mejor algoritmo de clasificación, ¡pero en este momento encuentro que mi algoritmo de clasificación de inserción y luego de inserción es efectivo a mano!

Puedes pensar en esto de una manera similar a ordenar en una computadora. Existen dos cuestiones de tiempo, que son aproximadamente las mismas tanto en el sistema humano como en el informático; y memoria, que se traduce aproximadamente a la cantidad de espacio de trabajo en la mesa o el piso que tiene. Sin embargo, en el mundo real, los humanos no son muy buenos para abordar estas ranuras de memoria en el tiempo O (1). Si bien las computadoras pueden acceder fácilmente a la 525a dirección de memoria, es mucho más difícil para un humano elegir una 525ta pila de papel en el suelo. Por lo tanto, en realidad hay un aumento en la complejidad del tiempo a medida que aumentan también los requisitos de “memoria”.

Entonces, hablemos de algoritmos específicos.

Ciertos tipos que funcionan bien computacionalmente simplemente no funcionan con las personas. Quicksort y heapsort, por ejemplo, simplemente no tienen sentido teniendo en cuenta las dificultades de direccionamiento mencionadas anteriormente.

Los tipos O (N ^ 2) que a menudo se descartan en realidad funcionan bastante bien, ya que el N es relativamente pequeño la mayor parte del tiempo cuando se clasifica el papel, y el acto de buscar linealmente a través de la pila de papeles, que la mayoría de esta clase de El algoritmo depende de, toma aproximadamente el mismo tiempo que abordar específicamente un subconjunto.

Los tipos de cubo realmente funcionan muy bien, ya que todavía podemos abordar relativamente rápido las 26 letras en inglés.

Definitivamente, hay clases recursivas que aún pueden funcionar bien cuando se clasifica a mano. Mergesort solo depende de la comparación entre dos objetos a la vez y de la fusión en una sola pila, por lo que funciona especialmente bien. Sin embargo, se necesita mucho espacio si sigue el algoritmo rigurosamente.

Finalmente, una combinación de tipos a menudo funciona mejor que simplemente apegarse a un solo algoritmo. La implementación de GNU de sort es una combinación de introsort (que en sí mismo es quicksort + heapsort) y de inserción. Entonces, en la práctica, descubrí que lo que funciona bien con pilas grandes (entre 300 y 1000 papeles) es dividir primero la pila en K subpilas, donde K es una potencia de dos, y cada sub-pila tiene menos de 100 hojas de papel Luego, cubra cada sub-pila alfabéticamente. La mayoría de los cubos deben ser pequeños, por lo que la selección o el orden de inserción pueden poner rápidamente cada cubo en orden. Una vez que se ordena cada sub-pila, comience a combinar pares por mergesort.