¿Qué es la estabilidad en los algoritmos de clasificación y por qué es importante?

292

Tengo mucha curiosidad, ¿por qué la estabilidad es o no importante en la clasificación de algoritmos?

Darth Vader
fuente
2
¿Para propósitos de paralelización? por ejemplo: la ordenación de fusión es estable y se puede paralelizar bien y también lo es la ordenación rápida.
DarthVader
13
QuickSort clásico es inestable
Konstantin Spirin
99
estable especie algo -IBM (Insertion, Bubble, Merge)
roottraveller
Una nota para aquellos que podrían entender mal el concepto como yo: se garantiza que se preservará el orden de elementos iguales. significa: si los elementos en orden estable se consideran iguales, entonces seguirían el orden anterior. No es lo que solía pensar: si los elementos en el orden anterior se consideran iguales, entonces, en el próximo orden estable, seguirían el orden anterior. Aunque es posible que la última comprensión también tenga sentido en muchos casos.
Rick

Respuestas:

371

Se dice que un algoritmo de ordenación es estable si dos objetos con claves iguales aparecen en el mismo orden en la salida ordenada que aparecen en la matriz de entrada a ordenar. Algunos algoritmos de ordenación son estables por naturaleza, como la ordenación por inserción, la ordenación por fusión, la ordenación por burbujas, etc. Y algunos algoritmos de ordenación no lo son, como la ordenación por montón, la ordenación rápida, etc.

Antecedentes : un algoritmo de clasificación "estable" mantiene los elementos con la misma clave de clasificación en orden. Supongamos que tenemos una lista de palabras de 5 letras:

peach
straw
apple
spork

Si clasificamos la lista solo por la primera letra de cada palabra, un tipo estable produciría:

apple
peach
straw
spork

En un algoritmo de ordenamiento inestable , strawo sporkpuede intercambiarse, pero en uno estable, permanecen en las mismas posiciones relativas (es decir, como strawaparece antes sporken la entrada, también aparece antes sporken la salida).

Podríamos ordenar la lista de palabras usando este algoritmo: ordenación estable por columna 5, luego 4, luego 3, luego 2, luego 1. Al final, se ordenará correctamente. Convénzase de eso. (por cierto, ese algoritmo se llama clasificación de radix)

Ahora, para responder a su pregunta, supongamos que tenemos una lista de nombres y apellidos. Se nos pide que ordenemos "por apellido, luego por primero". Primero podríamos ordenar (estable o inestable) por el primer nombre, luego estable ordenar por el apellido. Después de estos tipos, la lista se ordena principalmente por el apellido. Sin embargo, donde los apellidos son iguales, los nombres se ordenan.

No puedes apilar tipos inestables de la misma manera.

Joey Adams
fuente
Entonces, ¿cómo se llamaría el tipo para hacer que las palabras en el orden de clasificación correcto de apple peach sport paja? La ordenación estable nos dio paja manzana melocotón spork embargo st debe ser después sp (alfabéticamente correcto), por lo que el último tipo correcto debería ser de manzana paja deporte melocotón
user1416486
2
@ user1416486: Estamos clasificando solo por la primera letra. Con esa suposición, strawy sporkcomparar igual. La ordenación estable preservará el orden de entrada, mientras que la ordenación inestable no garantiza eso. "Correcto" depende de la aplicación. La función de clasificación en la mayoría de los lenguajes de programación permite al usuario proporcionar una función de pedido personalizada. Si la función del usuario trata diferentes elementos como iguales (por ejemplo, el mismo nombre, diferente apellido), ayuda saber si se conservará el orden original. Vea las funciones de clasificación de matriz de OCaml para un ejemplo del mundo real.
Joey Adams
3
No entiendo la línea .. misma clave de clasificación ? ¿Qué quieres decir con clave aquí? Por favor explique la declaración ... misma clave de clasificación
saplingPro
2
@saplingPro: por "clave de clasificación", me refiero a la cosa por la que clasifica los elementos. Entonces, al ordenar por primera letra, luego para cada elemento, su "clave de clasificación" es su primera letra.
Joey Adams
12
Ejemplo: supongamos que tiene una lista con cada elemento que contiene información sobre el destino del vuelo y la hora de salida. Primero ordena la lista según el tiempo. Luego lo clasificamos según el destino. Si el segundo tipo es estable , ahora tenemos todos los vuelos unidos al mismo destino juntos y en orden creciente de hora de salida. Si no fuera estable, no estarían en orden de tiempo creciente.
roottraveller
55

Un algoritmo de ordenación estable es el que clasifica los elementos idénticos en el mismo orden en que aparecen en la entrada, mientras que la ordenación inestable puede no satisfacer el caso. - Agradezco a mi profesor de algoritmos, Didem Gozupek, por haber proporcionado información sobre los algoritmos .

Algoritmos de clasificación estables:

  • Tipo de inserción
  • Ordenar fusión
  • Ordenamiento de burbuja
  • Tim Sort
  • Contando Ordenar
  • Orden de bloque
  • Quadsort
  • Ordenar biblioteca
  • Coctelera Ordenar
  • Gnome Sort
  • Clases pares e impares

Algoritmos de clasificación inestables:

  • Tipo de montón
  • Tipo de selección
  • Tipo de concha
  • Ordenación rápida
  • Introsort (sujeto a Quicksort)
  • Tipo de árbol
  • Tipo de ciclo
  • Smoothsort
  • Clasificación de torneo (sujeto a Hesapsort)

ingrese la descripción de la imagen aquí

snr
fuente
2
Tus valores no son iguales. Usted compara 9,7 y 9,8, pero de acuerdo con el control de estabilidad, necesita los mismos valores como ambos 9,7 o ambos 9,8. Y que los mismos valores deben ordenarse en algoritmos estables.
erhun
1
No, para verificar la estabilidad, sus valores deben ser los mismos. Quiero decir, suponga que usa dos 9,7 y asígnele el nombre en el nodo A y el nodo B. Si cada orden de operación de clasificación es como A, B (en lugar de ser iguales) entienda que el algoritmo de clasificación es estable (como la clasificación por fusión). Si el orden A, B cambia cuando los ordena varias veces (1. clasifique A, B y luego B, A nuevamente A, B, etc.), comprenda que el algoritmo de clasificación es inestable (como la clasificación rápida) @snr
erhun
@snr [9, 6] no está presente en la matriz de entrada. Creo que quisiste decir [9, 8] en la última tira de la matriz.
Usman
44
@erhun Creo que él está ordenando solo por el primer número (el que está antes de la coma) y está usando el segundo número solo como referencia para que veas que el primer 9 es diferente del segundo 9.
Tiago
20

La estabilidad de clasificación significa que los registros con la misma clave conservan su orden relativo antes y después de la clasificación.

Entonces, la estabilidad es importante si, y solo si, el problema que está resolviendo requiere la retención de ese orden relativo.

Si no necesita estabilidad, puede usar un algoritmo rápido de extracción de memoria de una biblioteca, como ordenamiento dinámico o rápido, y olvidarse de él.

Si necesita estabilidad, es más complicado. Los algoritmos estables tienen mayor uso de CPU y / o memoria big-O que los algoritmos inestables. Entonces, cuando tiene un gran conjunto de datos, debe elegir entre golpear la CPU o la memoria. Si tiene limitaciones tanto en la CPU como en la memoria, tiene un problema. Un buen algoritmo de compromiso estable es un árbol binario; el artículo de Wikipedia tiene un patéticamente fácil aplicación C ++ basado en la STL.

Puede convertir un algoritmo inestable en uno estable agregando el número de registro original como la clave de último lugar para cada registro.

Bob Murphy
fuente
1
Algoritmos estables como Merge Sort tienen la misma complejidad O (NlogN) que Quicksort; Sin embargo, el multiplicador constante del esfuerzo es mayor.
Jonathan Leffler el
Sí, y el uso de memoria en Merge Sort es O (N), mientras que en Quicksort es O (log N). La razón por la que mencioné Quicksort es que qsort () es una rutina de biblioteca estándar de C, por lo que está realmente disponible.
Bob Murphy el
1
La mejor respuesta general en mi humilde opinión. la técnica multitecla mencionada en otros es interesante pero sobrevalorada; es simple de aplicar, pero tiende a ser mucho más lento que las alternativas obvias (solo use una clasificación con una comparación de varias claves; o clasifique por la primera clave y luego identifique y clasifique las sublistas con duplicados). El hecho de que la ordenación estable produzca un resultado predecible puede ser importante en algunas aplicaciones. En particular, si tiene dos listas de entrada A, B que son idénticas, excepto que la lista B tiene una entrada adicional, las salidas para una ordenación estable serán idénticas, excepto que B tiene esa misma entrada adicional. Y +1 para el último pgph.
greggo
16

Depende de lo que hagas.

Imagine que tiene algunos registros de personas con un campo de nombre y apellido. Primero ordena la lista por nombre. Si luego ordena la lista con un algoritmo estable por apellido, tendrá una lista ordenada por nombre Y apellido.

svens
fuente
44
Creo que te refieres a "apellido Y nombre". El apellido suele ser el apellido.
Bacon Bits
14

Hay algunas razones por las cuales la estabilidad puede ser importante. Una es que, si no es necesario intercambiar dos registros intercambiándolos, puede provocar una actualización de memoria, una página está marcada como sucia y debe reescribirse en el disco (u otro medio lento).

Clinton Pierce
fuente
¿Qué tiene que ver el intercambio de registros con la estabilidad?
user1683793
4

Se dice que un algoritmo de clasificación es estable si dos objetos con claves iguales aparecen en el mismo orden en la salida ordenada que en la matriz sin clasificar de entrada. Algunos algoritmos de ordenación son estables por naturaleza, como la ordenación por inserción, la ordenación por fusión, la ordenación por burbujas, etc. Y algunos algoritmos de ordenación no lo son, como la ordenación por montón, la ordenación rápida, etc.

Sin embargo, cualquier orden de clasificación que no sea estable puede modificarse para que sea estable. Puede haber formas específicas de clasificación para hacerlo estable, pero en general, cualquier algoritmo de clasificación basado en la comparación que no sea estable por naturaleza puede modificarse para que sea estable cambiando la operación de comparación de claves para que la comparación de dos claves considere la posición como un factor para objetos con claves iguales.

Referencias: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_algorithm#Stability

roottraveller
fuente
3

Sé que hay muchas respuestas para esto, pero para mí, esta respuesta , de Robert Harvey , lo resumió mucho más claramente:

Una ordenación estable es aquella que conserva el orden original del conjunto de entrada, donde el algoritmo [inestable] no distingue entre dos o más elementos.

Fuente

John R Perry
fuente
1

Si asume que lo que está ordenando son solo números y solo sus valores los identifican / distinguen (por ejemplo, los elementos con el mismo valor son idénticos), entonces el problema de estabilidad de la clasificación no tiene sentido.

Sin embargo, los objetos con la misma prioridad en la clasificación pueden ser distintos, y en algún momento su orden relativo es información significativa. En este caso, la ordenación inestable genera problemas.

Por ejemplo, tiene una lista de datos que contiene el costo de tiempo [T] de todos los jugadores para limpiar un laberinto con Nivel [L] en un juego. Supongamos que necesitamos clasificar a los jugadores según la rapidez con que limpian el laberinto. Sin embargo, se aplica una regla adicional: los jugadores que limpian el laberinto con un nivel superior siempre tienen un rango más alto, sin importar cuánto tiempo cuesta.

Por supuesto, puede intentar asignar el valor emparejado [T, L] a un número real [R] con algún algoritmo que siga las reglas y luego clasificar a todos los jugadores con el valor [R].

Sin embargo, si la ordenación estable es factible, entonces simplemente puede ordenar la lista completa por [T] (primero los jugadores más rápidos) y luego por [L]. En este caso, el orden relativo de los jugadores (por costo de tiempo) no cambiará después de haberlos agrupado por nivel de laberinto que limpiaron.

PD: por supuesto, el enfoque para ordenar dos veces no es la mejor solución para el problema en particular, pero para explicar la cuestión del póster debería ser suficiente.

M Ciel
fuente
0

La ordenación estable siempre devolverá la misma solución (permutación) en la misma entrada.

Por ejemplo, [2,1,2] se ordenará utilizando una clasificación estable como permutación [2,1,3] (primero es el índice 2, luego el índice 1 y luego el índice 3 en la salida ordenada). Eso significa que la salida siempre se baraja de la misma manera. Otra permutación no estable, pero aún correcta es [2,3,1].

La ordenación rápida no es estable y las diferencias de permutación entre los mismos elementos dependen del algoritmo para elegir el pivote. Algunas implementaciones comienzan al azar y eso puede hacer que la ordenación rápida produzca diferentes permutaciones en la misma entrada usando el mismo algoritmo.

El algoritmo de clasificación estable es necesario determinista.

Luka Rahne
fuente
2
Eso no es lo que significa estabilidad. Ver en.wikipedia.org/wiki/Sorting_algorithm#Stability
Luís Oliveira
Debería corregir la última oración para que la ordenación no estable pueda generar una solución diferente incluso entre la misma implementación, donde cualquier ordenación estable genera la misma solución.
Luka Rahne
1
¿Por qué -1? ¿Alguien puede señalar por favor qué está mal aquí? Esto no es lo que es la clasificación estable, sino la propiedad que tiene la clasificación estable.
Luka Rahne
Si el tipo es determinista o no, no determina si es estable. Puedo escribir un algoritmo de clasificación determinista no estable definiendo un comportamiento de desempate diferente (clasificando partes que no son clave, por ejemplo). La ordenación estable implica específicamente que el orden relativo previamente ordenado de los elementos se conserva cuando se ordenan los vínculos. ejemplo de una salida de una especie estable: sort([(5,3),(1,5),(3,3),(1,3)], x) => [(1,5),(1,3),(3,3),(5,3)]. Puedo hacer un tipo determinista que siempre (determinísticamente) genera: [(1,3),(1,5),(3,3),(5,3)]pero este no es un tipo estable.
cowbert
@cowbert Es más una declaración, sobre buena propiedad que tiene cada tipo estable. Eso no importa si se utiliza un algoritmo de clasificación estable o una implementación, cada vez habrá el mismo resultado. Es más difícil mantener dicha propiedad entre diferentes implementaciones de ordenación no estable.
Luka Rahne
0

Algunos ejemplos más de la razón por la que se desean tipos estables. Las bases de datos son un ejemplo común. Tome el caso de una base de datos de transacciones que incluya apellido | nombre, fecha | hora de compra, número de artículo, precio. Digamos que la base de datos normalmente está ordenada por fecha | hora. Luego se realiza una consulta para hacer una copia ordenada de la base de datos por apellido |, ya que una ordenación estable conserva el orden original, aunque la comparación de consultas solo involucra el apellido, las transacciones para cada apellido | estar en orden de datos | tiempo.

Un ejemplo similar es el Excel clásico, que limita las clases a 3 columnas a la vez. Para ordenar 6 columnas, se realiza una ordenación con las 3 columnas menos significativas, seguida de una ordenación con las 3 columnas más significativas.

Un ejemplo clásico de una clasificación de radix estable es un clasificador de tarjetas, usado para clasificar por un campo de columnas numéricas de base 10. Las tarjetas se ordenan del dígito menos significativo al dígito más significativo. En cada pase, se lee un mazo de cartas y se separa en 10 compartimientos diferentes de acuerdo con el dígito en esa columna. Luego, las 10 bandejas de tarjetas se vuelven a colocar en la tolva de entrada en orden (las tarjetas "0" primero, las tarjetas "9" al final). Luego se realiza otro pase en la siguiente columna, hasta que todas las columnas estén ordenadas. Los clasificadores de tarjetas reales tienen más de 10 bandejas, ya que hay 12 zonas en una tarjeta, una columna puede estar en blanco y hay una bandeja de lectura incorrecta. Para ordenar letras, se necesitan 2 pasadas por columna, 1ra pasada para el dígito, 2da pasada para la zona 12 11.

Más tarde (1937) hubo máquinas de clasificación (fusión) de tarjetas que podían fusionar dos barajas de cartas al comparar campos. La entrada era dos mazos de cartas ya ordenados, un mazo maestro y un mazo de actualización. El intercalador fusionó las dos cubiertas en una nueva papelera y una papelera de archivo, que se usaba opcionalmente para duplicados maestros para que la nueva papelera maestra solo tuviera tarjetas de actualización en caso de duplicados. Esta fue probablemente la base de la idea detrás del tipo de fusión original (de abajo hacia arriba).

rcgldr
fuente