En programación de computadoras, ¿por qué es importante la clasificación? ¿Cuándo se utilizan los algoritmos de clasificación en la codificación real?

La clasificación es crítica para muchas tareas. Señalaré solo algunos, pero son característicos del tipo de cosas para las que utiliza la clasificación.

Ejemplo 1: dado un conjunto de un millón de registros de datos, elimine o combine los duplicados.

Si los registros de datos se ordenan según el criterio de unicidad principal, la eliminación de los duplicados se puede hacer fácilmente recorriendo la lista y encontrando grupos de registros consecutivos que se comparan igual usando ese criterio.

Ejemplo 2: Compare dos grandes conjuntos de elementos y descubra en qué difieren.

Probemos esto a mano. Aquí hay dos listas ordenadas al azar de 15 números:

3 16 13 9 15 12 2 10 14 8 7 1 6 4 11
14 1 5 6 13 12 3 11 15 4 7 8 10 2 16

¿Me puede decir qué número de la lista 1 falta en la lista 2 y viceversa? Bastante difícil, ¿eh? Y eso con solo 15 números.

Ahora, intentemos de nuevo. Aquí tenemos las mismas dos listas en orden:

1 2 3 4 6 7 8 9 10 11 12 13 14 15 16
1 2 3 4 5 6 7 8 10 11 12 13 14 15 16

No es difícil repasar las listas en paralelo y seleccionar las diferencias, ¿verdad? Lo mismo es cierto para un programa de computadora. Usando la notación big-O, comparar cada elemento de una lista con cada elemento de otra lista es una operación O ([matemática] n ^ 2 [/ matemática]) mientras que comparar las listas ordenadas es una operación O (n). Eso significa que el costo de comparar las listas sin ordenar aumenta con el cuadrado del número de elementos, mientras que el costo de comparar las listas ordenadas crece linealmente. Piensa en lo que eso significa cuando consideras una lista de un millón de elementos. Las mismas fórmulas big-O se aplican al Ejemplo 1.

Ejemplo 3: Utilizando las mismas listas que en el Ejemplo 2, averigüe si el número 5 aparece en cada lista. Para las listas no ordenadas, debe mirar cada elemento hasta que encuentre el 5 o llegue al final de la lista. En promedio, para una lista de n elementos, se necesitarán comparaciones [matemáticas] n / 2 [/ matemáticas] para encontrar lo que está buscando si existe y n comparaciones si no existe. Sin embargo, con la lista ordenada, puede usar la búsqueda binaria: mire el elemento del medio, si es más de 5, siga buscando en la primera mitad de la lista; si es menos de 5, sigue buscando en la segunda mitad de la lista; sigue dividiendo la lista por la mitad hasta que la encuentres o no te quede nada. Al usar la búsqueda binaria, se garantiza que encontrará su respuesta o fallará en las comparaciones [math] log2 (n) [/ math] (4 comparaciones como máximo para nuestra lista de 15 elementos). La próxima vez que use un diccionario (en papel), considere lo difícil que sería usarlo si las palabras no estuvieran ordenadas alfabéticamente.

Por supuesto, para obtener estos beneficios de rendimiento, debe pagar el costo de ordenar la lista, que generalmente es [matemática] O (n * log (n)) [/ matemática], aunque algunos algoritmos de clasificación son más rápidos para ciertos tipos de datos Sin embargo, es muy común construir listas y reutilizarlas con frecuencia, sin cambios. En ese caso, paga el costo de ordenar solo una vez (u ocasionalmente), pero obtiene los beneficios una y otra vez.

Creo que puedo llamarme un ‘codificador real’, y en mi ‘codificación real’ nunca escribo algoritmos de clasificación. La ordenación es un problema bien resuelto, y cuando necesito cosas ordenadas, lo pongo en un std :: vector y llamo a std :: sort en él. Si los objetos que se están ordenando son demasiado grandes / complejos para ser copiados / intercambiados por todo el lugar, entonces haría un vector de índices y una pequeña función de comparación personalizada, y los pasaría a std :: sort.

PERO cuando estaba en la universidad y en la escuela de posgrado, todos los algoritmos de clasificación también se profundizaron en mí, porque son problemas fundamentales que ilustran bien la diferencia entre la complejidad algorítmica O (n ^ 2) y O (nlogn). Debido a mi base en ese tipo de problemas más simples, tengo la capacidad de abordar problemas de nivel superior y de tomar decisiones acertadas sobre cómo reducir la complejidad algorítmica de mi código (y cuando sea necesario: ‘no optimice demasiado pronto ‘es una gran lección que debe entenderse como un buen programador).

Por ejemplo, recientemente tuve una experiencia en la que un colega me dio un código prototipo para ‘productizar’. Es más inteligente que yo, es mejor científico que yo, pero yo soy mejor ingeniero de software que él. Parte de sus instrucciones sobre cómo usar lo que me había dado decía “compilar y ejecutar (500 imágenes duran unos 30 minutos)”. No tardé mucho en determinar que la mayor parte de ese tiempo se quemó en bucles anidados dobles y triples y cuádruples que estaban pasando por combinaciones de imágenes para configurar una indexación complicada, de modo que el cálculo real pudiera tener todo necesitaba a su alcance y correr rápidamente. En un par de horas, pude reescribir la población de esos índices usando O (logn) -access std :: maps en lugar de usar O (n) buscando cosas en std :: vectors todo el tiempo y el tiempo total de ejecución cayó a unos 10 segundos.

En la programación de computadoras, la ordenación es importante cuando desea ordenar algo, y ocasionalmente es importante usar la ordenación correcta. Normalmente, los tipos los proporciona un marco o una biblioteca que serán lo suficientemente buenos para la mayoría de los propósitos (aunque si usted es el que escribe el marco / biblioteca, esa es otra historia).

Sin embargo, sospecho que esa no es su verdadera pregunta, y que su verdadera pregunta es “Estoy estudiando algoritmos y seguramente parecen demasiado interesados ​​en la clasificación. ¿Por qué es eso?”

Es la misma razón por la que la gente parece demasiado interesada en el factorial cuando comienzas a hablar de recurrencia: es algo que ya sabes cómo hacer, pero ahora lo verás de una manera nueva. Muestran cómo los diferentes tipos de algoritmos pueden marcar una gran diferencia en el rendimiento. Muestran cómo calcular la tasa de crecimiento del tiempo requerido a medida que aumenta el número de elementos.

La ordenación es un algoritmo que organiza los elementos de una lista en un cierto orden (ya sea ascendente o descendente).

La salida de la ordenación es el reordenamiento de los elementos de entrada.

y ahora surge la pregunta de por qué necesitamos ordenar.

La respuesta es que, la Clasificación es una de las principales categorías en Informática.

Como hemos visto, la clasificación reduce significativamente la complejidad de los problemas y la clasificación es una técnica que reduce la complejidad de la búsqueda.

por ejemplo, la ordenación es necesaria antes de aplicar la búsqueda binaria y la ordenación también se utiliza en algoritmos de bases de datos.

La clasificación es importante en la programación por la misma razón que es importante en la vida cotidiana. Es más fácil y rápido ubicar elementos en una lista ordenada que sin clasificar. Los algoritmos de clasificación se pueden usar en un programa para clasificar una matriz para buscar o escribir más tarde en un archivo o informe ordenado.

Las matrices / listas ordenadas hacen que sea más fácil encontrar cosas más rápidamente. Además, hay muchos algoritmos de clasificación, pero la clasificación rápida es una de las más rápidas y fáciles de implementar.
quickSort :: (Ord a) => [a] -> [a]
quickSort [] = []
quickSort (x: xs) = quickSort [a | a = x]

Lo escribí de memoria; no juzgues

La clasificación es un paso importante para acelerar las operaciones posteriores en una estructura de datos.

Otro ejemplo en el que escribe su propia función de clasificación es cuando solo le interesan los mejores n resultados de una lista y no requiere que se ordene toda la lista.

Escribo programas en C. Intenté mergesort, selectsort, bubblesort y qsort. Escribí merge, select y bubblesort, usé qsort de la biblioteca GCC. Bubblesort es muy simple y muy lento, no para uso real, sino divertido. Qsort es el ganador general, mergesort no está mal.