¿Cuáles son los ejemplos prácticos de algoritmos de clasificación? He oído hablar de la clasificación de burbujas, la clasificación rápida y la clasificación por inserción. ¿Cuáles son los ejemplos prácticos de estos algoritmos? ¿Para qué se usan y dónde son necesarios en los sistemas de software?

La clasificación es uno de los aspectos fundamentales de la informática.

A lo largo de la breve historia de la informática, los algoritmos de clasificación maduraron a un ritmo rápido y desde los primeros días las computadoras comenzaron a utilizar métodos sofisticados para clasificar los elementos en una estructura de recopilación de datos.

Muchas cosas afectan nuestra elección de usar un algoritmo de clasificación como la cantidad de elementos, el espacio disponible, el presupuesto, las prioridades en nuestra aplicación, etc.

Tratemos de verlos uno por uno:

  • Tipo de selección

La selección de selección es una excepción en nuestra lista. Esto se considera un algoritmo de clasificación académica. ¿Por qué? Porque la eficiencia del tiempo es siempre O (n ^ 2), lo cual no es aceptable. No hay uso en el mundo real para el tipo de selección, excepto aprobar el examen del curso de estructura de datos.

pros:

Nada

contras:

Ejecutar siempre en O (n2) incluso en el mejor de los casos

Uso práctico:

Ayude a los estudiantes a obtener algunos créditos para su título, nada para ser precisos

  • Ordenamiento de burbuja

Esta es la otra excepción en la lista porque el ordenamiento de burbujas es demasiado lento para ser práctico. A menos que la secuencia esté casi ordenada, la factibilidad de la clasificación de burbujas es cero y el tiempo de ejecución es O (n ^ 2). Este es uno de los tres algoritmos de ordenamiento simples junto con el ordenamiento por selección y el ordenamiento por inserción, pero al igual que el ordenamiento por selección no alcanza el ordenamiento por inserción en términos de eficiencia incluso para secuencias pequeñas.

pros:

De nuevo nada, tal vez solo “pegadizo nombre1”

contras:

Con el polinomio O (n2) es demasiado lento

Uso práctico:

Implementarlo es un ejercicio de programación interesante.

  • Tipo de inserción

El tipo de inserción definitivamente no es el algoritmo más eficiente, pero su poder radica en su simplicidad. Dado que es muy fácil de implementar y adecuadamente eficiente para un pequeño número de elementos, es útil para aplicaciones pequeñas o triviales. La definición de pequeño es vaga y depende de muchas cosas, pero una apuesta segura es que si es menor de 50, el tipo de inserción es lo suficientemente rápido. Otra situación en la que es útil la ordenación por inserción es cuando la secuencia está casi ordenada. Tales secuencias pueden parecer excepciones, pero en las aplicaciones del mundo real a menudo se encuentran elementos casi ordenados. El tiempo de ejecución de la ordenación de inserciones es O (n ^ 2) en el peor de los casos. Hasta ahora tenemos otra alternativa inútil para el tipo de selección. Pero si se implementa bien, el tiempo de ejecución se puede reducir a O (n + k). n es el número de elementos yk es el número de inversiones (el número de pares de elementos fuera de orden). Con este nuevo tiempo de ejecución en mente, puede ver si la secuencia está casi ordenada (k es pequeña), el tiempo de ejecución puede ser casi lineal, lo que es una gran mejora sobre el polinomio n ^ 2.

pros:

Fácil de implementar

Cuanto más ordenada está la secuencia, más cerca está el tiempo de ejecución del tiempo lineal O (n)

contras:

No es adecuado para grandes conjuntos de datos.

Todavía polinomio en el peor de los casos

Uso práctico

Para aplicaciones pequeñas cuando la secuencia es pequeña (menos de 50 elementos)

Cuando la secuencia va a estar casi ordenada

  • Tipo de montón

Este es el primer algoritmo de clasificación de propósito general que presentamos aquí. La ordenación del montón se ejecuta en O (nlogn), lo cual es óptimo para los algoritmos de ordenación basados ​​en la comparación. Aunque la ordenación en montón tiene el mismo tiempo de ejecución que la ordenación rápida y la ordenación por fusión, generalmente se supera en escenarios del mundo real. Si se pregunta por qué alguien debería usarlo, la respuesta está en la eficiencia del espacio. Hoy en día las computadoras vienen con una gran cantidad de memoria, suficiente para muchas aplicaciones. ¿Esto significa que el montón está perdiendo su brillo? No, aún cuando se escriben programas para entornos con memoria limitada, como sistemas integrados o eficiencia de espacio, es mucho más importante que la eficiencia de tiempo. Una regla general es que si la secuencia es lo suficientemente pequeña como para caber fácilmente en la memoria principal, entonces la ordenación del montón es una buena opción.

pros:

Se ejecuta en O (nlogn)

Se puede implementar fácilmente para ejecutarse en el lugar

contras:

No es tan rápido como otros algoritmos basados ​​en comparación en grandes conjuntos de datos

No proporciona una clasificación estable

Uso práctico:

La elección natural para secuencias pequeñas y medianas

Si se trata del tamaño de la memoria principal, la mejor opción es la ordenación del montón

  • Ordenación rápida

Uno de los algoritmos de clasificación más utilizados en la industria informática. El ordenamiento sorprendentemente rápido tiene un tiempo de ejecución de O (n ^ 2) que lo hace susceptible en aplicaciones en tiempo real. Tener un polinomio en el peor de los casos, la ordenación rápida sigue superando tanto la ordenación rápida como la ordenación por fusión (a continuación). La razón detrás de la popularidad de la clasificación rápida a pesar de las deficiencias es tanto la rapidez en los escenarios del mundo real (no necesariamente el peor de los casos) como la capacidad de implementarse como un algoritmo en el lugar.

pros:

La mayoría de las veces se ejecuta en O (nlogn)

La clasificación rápida se ha probado y es verdadera, se ha utilizado durante muchos años en la industria, por lo que puede estar seguro de que no le fallará

Alta eficiencia espacial al ejecutar en el lugar

contras:

El peor escenario polinómico lo hace susceptible a aplicaciones de tiempo crítico

Proporciona ordenación no estable debido al intercambio de elementos en el paso de partición

Uso práctico:

La mejor opción para uso general y en clasificación de memoria

Solía ​​ser el algoritmo estándar para clasificar matrices de tipos primitivos en Java

La utilidad qsort en lenguaje de programación C funciona con ordenación rápida

  • Ordenar fusión

Tener un tiempo de ejecución de O (nlogn) en el peor de los casos hace que la fusión sea un poderoso algoritmo de clasificación. El principal inconveniente de este algoritmo es su ineficiencia espacial. Eso está en el proceso de clasificar muchas matrices temporales que deben crearse y muchas copias de elementos están involucradas. Esto no significa que la ordenación por fusión no sea útil. Cuando los datos que se ordenarán se distribuyen en diferentes ubicaciones como caché, memoria principal, etc., es inevitable copiar datos. La clasificación por fusión principalmente debe su popularidad a Tim Peters, quien diseñó una variante de la misma que es esencialmente una clasificación por fusión de abajo hacia arriba y se conoce como clasificación por Tim.

pros:

Excelente opción cuando los datos se obtienen de recursos distintos de la memoria principal

Tener un peor escenario de tiempo de ejecución de O (nlogn) que es óptimo

La variante de clasificación de Tim es realmente poderosa

contras:

Muchos gastos generales al copiar datos entre matrices y hacer nuevas matrices

Extremadamente difícil de implementar en su lugar para matrices

Ineficiencia espacial

Uso práctico:

Cuando los datos están en diferentes ubicaciones como caché, memoria principal, memoria externa, etc.

Se utiliza una variante de clasificación de combinación múltiple en la utilidad de clasificación de GNU

La variante de clasificación de Tim es un algoritmo de clasificación estándar en lenguaje de programación Python desde 2003

Algoritmo de clasificación predeterminado de matrices de tipo de objeto en Java desde la versión 7 en adelante

  • Algoritmos de clasificación de propósito especial

Aunque actualmente O (nlogn) parece un límite irrompible para los algoritmos de clasificación, esto solo es cierto para los propósitos generales. Si las entidades que se ordenarán son números enteros, cadenas o d-tuplas, entonces no está limitado por los algoritmos de clasificación anteriores. Radix sort y Bucket sort son dos de los algoritmos de clasificación de propósito especial más famosos. su peor caso de ejecución es O (f (n + r)). [0, r-1] es el rango de enteros yf = 1 para la clasificación de cubetas. En general, esto significa que si f (n + r) está significativamente por debajo de la función nlogn, entonces estos métodos son más rápidos que tres potentes algoritmos de clasificación de propósito general, clasificación de fusión, clasificación rápida y clasificación de montón.

pros:

Pueden correr más rápido que nlogn

contras:

No se puede utilizar para todo tipo de datos.

No necesariamente siempre se ejecuta más rápido que los algoritmos de propósito general

Uso práctico:

Cuando se cumplen los requisitos previos de los tipos de datos, son la elección definitiva.

Soy un programador de gráficos / juegos. Te diré cómo la clasificación es útil para mí.

Digamos que está haciendo un motor gráfico para mostrar algo como esto:

Cosas como el terreno, las rocas y las personas son mallas poligonales en 3D, mientras que los grupos de césped se representan como vallas publicitarias, es decir, solo un cuadrado que siempre está frente a la cámara con una textura de vegetación aplicada. Tienen un canal alfa que controla la transparencia de la textura.

Ahora, la geometría opaca, como las personas y las rocas, debe dibujarse de adelante hacia atrás. La razón de esto es que cada píxel que debe dibujarse puede requerir muchos cálculos y búsquedas de textura. Necesita buscar de qué color (es) es la superficie, quizás cuán irregular es, cuán especular es u otra información sobre cómo la superficie interactúa con la luz. Luego, necesita muchos cálculos de cómo la luz rebota para obtener el color final de ese píxel. Sin embargo, si la cámara está mirando una roca grande, no tiene sentido renderizar todos los píxeles de todas las cosas detrás de la roca y luego oscurecerla pintando sobre ella con la roca. Las GPU están diseñadas para pintar píxeles muy rápidamente, pero no tienen una velocidad infinita. Es mucho mejor omitir todo ese largo cálculo de píxeles si nunca se van a ver. En ese caso, sería mejor dibujar la roca primero y luego omitir cualquier píxel que esté más alejado (que es exactamente lo que el zbuffer ya está haciendo). Por lo tanto, las mallas opacas siempre deben clasificarse de adelante hacia atrás según la distancia a la cámara (y eso incluye el cielo, que generalmente es solo una gran caja con textura).

Sin embargo, para las cosas que usan transparencia, como la hierba, usa la mezcla, que combina el color que se escribirá con lo que ya se haya pintado en ese píxel. Para evitar el alias que es muy feo, las texturas de hierba tienen bordes suaves y agradables que utilizan diferentes niveles de transparencia. Por lo tanto, todas estas vallas publicitarias deben dibujarse de atrás hacia adelante después de dibujar todo el material opaco.

Espero que tenga un poco de sentido. Por lo tanto, toda la geometría en un pase de renderizado debe colocarse en una lista, y la lista debe clasificarse de una forma u otra utilizando la distancia a la cámara como métrica. Esto se hace para que puedan renderizarse en el orden correcto según la necesidad particular.

Este es solo un ejemplo de cómo la clasificación es útil para escribir aplicaciones.

Voy a tomar “práctico” en el sentido de “vida real”, porque eso hará que esto sea mucho más divertido.

Ordenamiento de burbuja:

Imagine por alguna razón que tiene como 8 muñecas rusas de anidación, todo en una fila. Están fuera de servicio (es decir, el más grande está en algún punto intermedio, etc.).

En este mundo, aunque puede cumplir con una tarea, tiene una discapacidad mental limitada y tiene el recuerdo de un pez dorado. * Como resultado, solo puede pensar en 2 muñecas a la vez.

Entonces … ¿cómo se ordenan las muñecas? Empiezas desde la izquierda y miras cada par (incluidos los pares superpuestos, es decir, 1 y 2 son un par, luego 2 y 3 son un par, etc.). Estás tratando de organizar las muñecas de la más pequeña a la más grande, por lo que si una muñeca más grande está a la izquierda, la cambias por la más pequeña a la derecha.

Repite esto hasta llegar al final de la línea.

Luego regresa al comienzo de la línea y hace lo mismo una y otra vez, hasta que pasa la línea y no tiene que hacer ningún cambio.

Luego, las muñecas se ordenan, y puedes apilarlas todas o hacer cualquier cosa espeluznante que la gente suele hacer con las muñecas rusas.

Tada … así es como funciona una burbuja.

Ordenación rápida:

Suponga que es un sabio que tiene la capacidad de dividir su memoria de trabajo y (idealmente) sus procesos de pensamiento a la mitad a voluntad.

Suponga que tiene una lista de 1000 números en orden aleatorio que desea ordenar.

Elija un número aleatorio y llame a esto el pivote.

Usa tus poderes de brujo para poner mentalmente todos los números más pequeños que el pivote a la izquierda y todos los más grandes al pivote a la derecha.

Ahora use sus poderes de división del cerebro para repetir exactamente este proceso con cada mitad (seleccionando nuevos pivotes de las mitades izquierda y derecha, y clasificando las mitades izquierda y derecha de las mitades izquierda y derecha en sus lados apropiados).

Ahora continúa dividiendo y repitiendo esto hasta que te quede solo un elemento para cada mini cerebro.

Luego, de izquierda a derecha, pídales a todos los mini cerebros que tosen el número que les queda y anótelos uno por uno.

Tada … así es como funciona una clasificación rápida. Es mucho más eficiente (para la mayoría de los casos de uso) que el tipo burbuja, mucho más rápido y es capaz de paralelizar.

Ahora ves por qué usamos computadoras para estas cosas.


* En serio, no me importa una mierda la memoria de un pez dorado real. No publique un “en realidad” en los comentarios.

Tome cualquier ejemplo como el mapa de Google.

Encontrará el algoritmo de búsqueda y clasificación en su núcleo. Cualquier aplicación de base de datos relacionada con ordenar, contar y buscar, verificar la base de datos interna o la base de datos como Oracle. Cualquier aplicación de redes sociales como twitter.

Si desea conocer el proceso superior que se ejecuta en la máquina Linux, mostrará el proceso superior en función de sus usos de recursos utilizando este método de clasificación y búsqueda. Comando grep de Linux basado en el algoritmo de búsqueda.

Este algoritmo se utiliza en procesamiento de texto o minería de datos o en el campo de la ciencia de datos.

En caso de que realmente soy el único ingeniero de software o informático aquí que entendió la intención de esta pregunta, doy una respuesta rápida. Eso sería sorprendente, lo sé, y podría estar equivocado, pero aquí está lo mejor que respondo que puedo explicar rápidamente.

Los algoritmos de clasificación son muy útiles para crear índices, por ejemplo, los índices en los sistemas de bases de datos. Un sistema de base de datos utilizará un índice para encontrar rápidamente un dato en particular. Esto es análogo a esas guías telefónicas anticuadas que ya no usamos porque Internet nos indexa todo.

Para comprender la indexación de la base de datos y cómo integran los algoritmos de clasificación en toda la solución, alguien puede publicar más preguntas.

Para elegir un algoritmo de clasificación, no dude en leer otras respuestas a esta pregunta.

Lo más importante que necesita saber sobre los algoritmos de clasificación es que no necesita conocerlos. Hace 30 años, en el mundo de la informática, es posible que haya tenido que escribir un algoritmo de clasificación. Hoy vienen como parte de su entorno en un lenguaje como Java y C #. Incluso C y C ++ generalmente tienen el algoritmo Quicksort ya implementado, y en un nivel mucho más optimizado que el que un programador promedio podría implementar. Quicksort es un algoritmo decente y generalmente superior en la mayoría de las necesidades.

No digo que no debas aprender los otros algoritmos. A veces, para ciertos conjuntos de datos, algunos de los más esotéricos son mejores. Son útiles para los conceptos que enseñan. Pero en los últimos 50 años, la mayoría de los conceptos básicos han sido cubiertos durante mucho tiempo y es mejor que se apoye en los hombros de sus predecesores, use su código y bibliotecas y avance con los conceptos de nivel superior de su código en lugar de aprender a escribir nuevos algoritmos de clasificación que alguien más inventó hace 40 años.

  • Ordenación rápida
  • El mejor algoritmo promedio de clasificación de casos
  • qsort en C
  • std :: sort en la mayoría de los casos para C ++
  • Timsort
    • Una clasificación híbrida estable que consiste en clasificación de inserción, clasificación de fusión y clasificación de selección.
    • Se rumorea que es mejor que qsort
    • Algoritmo de clasificación predeterminado de Python
  • Ordenar fusión
    • El mejor tipo estable
    • (Oracle) algoritmo de ordenación predeterminado de Java
  • Ordenamiento de burbuja
    • El tipo más lento (sin contar bogosort y stooge) estable de O (n ^ 2)
    • Tipo esencial para principiantes de algoritmos por su simple simplicidad

    Mergesort: O (n log n), especialmente útil para ordenar las listas vinculadas.

    Heapsort: O (n log n), útil para ordenar matrices y una ordenación común en memoria para motores de bases de datos.

    Sort-merge o polyphase merge sort: necesario para conjuntos de clasificación muy grandes que son demasiado grandes para caber en la memoria. Los motores de base de datos ordenarán los grupos en la memoria (con algo así como el montón), escribirán los grupos en los archivos del disco y leerán los registros de forma iterativa para fusionarlos en una secuencia ordenada cuando el conjunto ordenado se transmita a la aplicación (o el resto del consulta).

    Bubble-sort: tiene algunos usos para conjuntos de clasificación muy pequeños donde su rendimiento O (n ^ 2) no es un gran obstáculo, tiene muy poco código, por lo que puede ser útil para entornos restringidos como dispositivos pequeños, de lo contrario, a menudo se abusa de ellos. es “fácil de codificar”.

    Quicksort: el tipo de caballo de batalla para la mayoría de las bibliotecas de clasificación. Un O “rápido” (n log n) en el caso promedio, pero O (n ^ 2) en el peor de los casos. (El peor comportamiento en el peor de los casos es por qué los motores DB lo evitan).

    ¿Cuáles son los usos prácticos del algoritmo de ordenación rápida?

    Sin interés, el uso real y práctico de cualquier algoritmo de clasificación es ordenar cosas. Eso podría significar ordenar un grupo de usuarios por nombre de usuario o ID de usuario, mostrar su música en orden alfabético por nombre de pista, nombre de artista, etc., o mostrar su correo electrónico ordenado por remitente o fecha de envío.

    Esta es una pregunta que las personas pueden tener cuando toman una clase de algoritmos. Si aciertas esto, podrías estar pensando en algo incorrecto.

    A menudo, las clases de algoritmos cubrirán la clasificación ampliamente. Así es como puede ordenar los datos. Aquí hay otra forma. Aquí hay otra forma.

    Muchos estudiantes ven esto y tienen una conclusión clave: la clasificación debe ser muy importante.

    Y no están equivocados: puede ser muy importante, aunque más del 90% del tiempo que necesito para ordenar cosas, solo llamo un método Sort (). Pero esa no es la verdadera lección que la clase de algoritmos está tratando de enseñarte.

    Creo que la verdadera lección es: a menudo hay más de una forma de hacer las cosas. Cuando se enfrenta a un problema, es posible que pueda escribir un código que resuelva ese problema. Quizás eso sea lo suficientemente bueno. O tal vez, dependiendo de lo que esté haciendo, debería mirar nuevamente y ver si hay una manera mejor y más eficiente de hacer las cosas.

    Otra conclusión importante es que a menudo el problema que está tratando de resolver ya ha sido resuelto, a menudo por personas más inteligentes que usted o yo que pasamos mucho tiempo tratando de encontrar una forma eficiente de hacerlo. Si eso es cierto, generalmente desea comprender su solución, ver si tiene puntos débiles y, normalmente, solo usar su solución.

    El tipo que falta en otras respuestas … introsort … es el estándar ahora para aplicaciones en memoria que no son GPU (en algunos casos, uno puede usar hardware de GPU para realizar un tipo de fusión de Batcher par-impar … Menciono esto para completarlo).

    La complejidad en el peor momento de Quicksort siempre ha sido O (n ^ 2). Probar tres posibles valores de pivote para cada partición y usar la mediana ayuda, pero a veces no ayuda lo suficiente. En 1997, a David Musser se le ocurrió un híbrido de clasificación rápida, ordenada y de inserción llamada introsort que es O (n lg n) incluso para el peor de los casos, pero, a diferencia de la combinación, tiene un rendimiento promedio rápido.

    El truco consiste en realizar un seguimiento de la profundidad de la pila de quicksort y, si el número de particiones en la pila ha alcanzado un múltiplo sintonizable de log (base 2) de n, ordenar la partición actual de forma no recursiva utilizando heapsort. En cada caso, si una partición tiene menos de 16 elementos, se clasifica utilizando una clasificación de inserción en lugar de una clasificación rápida o ordenada.

    No estoy realmente seguro de lo que estás preguntando aquí. El uso práctico de cualquier algoritmo de clasificación es ordenar cosas. Eso es lo que hacen.

    Ahora, si se pregunta por qué elegir la clasificación rápida sobre otros tipos, bueno, de eso realmente podemos hablar. La ordenación rápida es fácil de implementar. Y es muy rápido en el caso general. Esas son realmente buenas razones para elegirlo. Si desea un análisis más profundo, Quicksort es una buena descripción general fácil de entender.

    La clasificación de burbujas también es uno de un buen ejemplo, pero encontré otro dispositivo de clasificación que hará que su trabajo sea más fácil y sin complicaciones. Haga clic en el enlace para saber más. Escanear, ordenar y guardar

    More Interesting

    ¿Cuál es la mejor fuente en línea para el aprendizaje de algoritmos?

    ¿Qué son las estructuras de datos y los algoritmos en c ++?

    Si f (n) es O (g (n)) yf (n) es O (h (n)), entonces cuál de las siguientes afirmaciones debe ser verdadera: f (n) + g (n) es O (h (n)), g (n) + h (n) es O (f (n)), f (n) es O (g (n) + h (n)), o ninguno de los anteriores?

    Informática: ¿Cuál es el futuro de la investigación en algoritmos?

    ¿La lista vinculada es una estructura de datos estática o una estructura de datos dinámica?

    ¿Por qué el algoritmo de refuerzo es robusto para sobreajustar?

    ¿Es adecuado CLRS para que un principiante comience su viaje de algoritmos y estructuras de datos? En caso afirmativo, ¿cómo se debe proceder?

    ¿Debo aprender C ++ ahora que sé cómo implementar algoritmos básicos de ML en Python, o debería seguir con scikit-learn?

    Actualmente estoy leyendo un libro sobre estructuras de datos y algoritmos. ¿Cuáles son algunos recursos que puedo usar para practicar la implementación?

    ¿Qué algoritmo de consenso de blockchain podría utilizar para crear una base de datos descentralizada de resultados de partidos de fútbol?

    ¿Qué es la ordenación de tramas en las redes?

    ¿Qué necesitas saber para aprender algoritmos? Probé los algoritmos gratuitos de Coursera y el curso de estructuras de datos de Princeton y me perdí por completo.

    ¿Necesitamos un algoritmo 10 veces más rápido o una máquina 10 veces más rápida? Da una razón para justificar tu respuesta.

    ¿Cuáles son los principales algoritmos en visión artificial?

    Cómo resolver la siguiente recursividad usando el árbol de recursión