stringtranslate.com

Clasificación con paciencia

En informática , la ordenación por paciencia es un algoritmo de ordenación inspirado en el juego de cartas paciencia , que recibe su nombre en honor a este . Una variante del algoritmo calcula de manera eficiente la longitud de la subsecuencia creciente más larga en una matriz dada .

Descripción general

El nombre del algoritmo deriva de una variante simplificada del juego de cartas de la paciencia. El juego comienza con una baraja de cartas mezclada. Las cartas se reparten una a una en una secuencia de pilas sobre la mesa, de acuerdo con las siguientes reglas. [2]

  1. Al principio no hay pilas. La primera carta que se reparte forma una nueva pila formada por una sola carta.
  2. Cada carta subsiguiente se coloca en la pila existente más a la izquierda cuya carta superior tenga un valor mayor o igual al valor de la nueva carta, o a la derecha de todas las pilas existentes, formando así una nueva pila.
  3. Cuando ya no quedan cartas para repartir, el juego termina.

Este juego de cartas se convierte en un algoritmo de ordenamiento de dos fases, de la siguiente manera. Dado un arreglo de n elementos de un dominio totalmente ordenado , considere este arreglo como una colección de cartas y simule el juego de ordenamiento de paciencia. Cuando el juego termine, recupere la secuencia ordenada seleccionando repetidamente la carta visible mínima; en otras palabras, realice una fusión de k vías de las p pilas, cada una de las cuales está ordenada internamente.

Análisis

La primera fase de la ordenación por paciencia, la simulación del juego de cartas, se puede implementar para tomar O ( n log n ) comparaciones en el peor de los casos para una matriz de entrada de n elementos: habrá como máximo n pilas y, por construcción, las cartas superiores de las pilas forman una secuencia creciente de izquierda a derecha, por lo que la pila deseada se puede encontrar mediante una búsqueda binaria . [1] La segunda fase, la fusión de pilas, también se puede realizar a tiempo utilizando una cola de prioridad . [1]

Cuando los datos de entrada contienen "ejecuciones" naturales, es decir, submatrices no decrecientes, entonces el rendimiento puede ser estrictamente mejor. De hecho, cuando la matriz de entrada ya está ordenada, todos los valores forman una única pila y ambas fases se ejecutan en tiempo O ( n ) . La complejidad del caso promedio sigue siendo O ( n log n ) : cualquier secuencia de valores uniformemente aleatoria producirá un número esperado de pilas [3] , que tardan tiempo en producirse y fusionarse. [1]

Chandramouli y Goldstein ofrecen una evaluación del rendimiento práctico de la ordenación por paciencia, y demuestran que una versión ingenua es aproximadamente diez a veinte veces más lenta que una ordenación rápida de última generación en su problema de referencia. Atribuyen esto a la relativamente pequeña cantidad de investigación dedicada a la ordenación por paciencia y desarrollan varias optimizaciones que reducen su rendimiento a un factor de dos del de la ordenación rápida. [1]

Si los valores de las cartas están en el rango 1, . . . , n , existe una implementación eficiente con un tiempo de ejecución en el peor de los casos para colocar las cartas en pilas, basándose en un árbol de Van Emde Boas . [3]

Relaciones con otros problemas

La clasificación por paciencia está estrechamente relacionada con un juego de cartas llamado el juego de Floyd. Este juego es muy similar al juego esbozado anteriormente: [2]

  1. La primera carta repartida forma una nueva pila formada por esa única carta.
  2. Cada carta subsiguiente se coloca en una pila existente cuya carta superior tiene un valor no menor que el valor de la nueva carta, o a la derecha de todas las pilas existentes, formando así una nueva pila.
  3. Cuando ya no quedan cartas para repartir, el juego termina.

El objetivo del juego es terminar con la menor cantidad de montones posible. La diferencia con el algoritmo de clasificación por paciencia es que no existe el requisito de colocar una nueva carta en el montón más a la izquierda, donde está permitido. La clasificación por paciencia constituye una estrategia codiciosa para jugar a este juego.

Aldous y Diaconis sugieren definir 9 pilas o menos como un resultado ganador para n = 52 , lo que ocurre con aproximadamente un 5% de probabilidad. [4]

Algoritmo para encontrar la subsecuencia creciente más larga

Primero, ejecute el algoritmo de ordenamiento como se describió anteriormente. El número de pilas es la longitud de la subsecuencia más larga. Siempre que se coloque una carta en la parte superior de una pila, coloque un puntero hacia atrás en la carta superior de la pila anterior (que, por supuesto, tiene un valor menor que el de la nueva carta). Al final, siga los punteros hacia atrás desde la carta superior de la última pila para recuperar una subsecuencia decreciente de la longitud más larga; su reverso es una respuesta al algoritmo de la subsecuencia creciente más larga.

S. Bespamyatnikh y M. Segal [3] describen una implementación eficiente del algoritmo, que no implica ningún costo asintótico adicional con respecto al de ordenamiento (ya que el almacenamiento, la creación y el recorrido de los punteros hacia atrás requieren tiempo y espacio lineales). Además, muestran cómo informar todas las subsecuencias crecientes más largas a partir de las mismas estructuras de datos resultantes .

Historia

El ordenamiento por paciencia fue bautizado por CL Mallows, quien atribuyó su invención a ASC Ross a principios de los años 1960. [1] Según Aldous y Diaconis, [4] el ordenamiento por paciencia fue reconocido por primera vez como un algoritmo para calcular la longitud de subsecuencia creciente más larga por Hammersley. [5] ASC Ross e independientemente Robert W. Floyd lo reconocieron como un algoritmo de ordenamiento. El análisis inicial fue realizado por Mallows. [6] El juego de Floyd fue desarrollado por Floyd en correspondencia con Donald Knuth . [2]

Usar

El algoritmo de ordenamiento por paciencia se puede aplicar al control de procesos . Dentro de una serie de mediciones, la existencia de una subsecuencia creciente larga se puede utilizar como marcador de tendencia. Un artículo de 2002 en la revista SQL Server incluye una implementación SQL, en este contexto, del algoritmo de ordenamiento por paciencia para la longitud de la subsecuencia creciente más larga. [7]

Referencias

  1. ^ abcdef Chandramouli, Badrish; Goldstein, Jonathan (2014). La paciencia es una virtud: reconsideración de la combinación y la clasificación en los procesadores modernos (PDF) . SIGMOD/PODS.
  2. ^ abc Burstein, Alexander; Lankham, Isaiah (2006). "Combinatoria de pilas de clasificación de paciencia" (PDF) . Séminaire Lotharingien de Combinatoire . 54A . arXiv : math/0506358 . Bibcode :2005math......6358B.
  3. ^ abc Bespamyatnikh, Sergei; Segal, Michael (2000). "Enumeración de subsecuencias crecientes más largas y ordenación por paciencia". Cartas de procesamiento de la información . 76 (1–2): 7–11. CiteSeerX 10.1.1.40.5912 . doi :10.1016/s0020-0190(00)00124-1. 
  4. ^ ab Aldous, David ; Diaconis, Persi (1999). "Subsecuencias crecientes más largas: de la ordenación por paciencia al teorema de Baik-Deift-Johansson". Boletín de la Sociedad Americana de Matemáticas . Nueva serie. 36 (4): 413–432. doi : 10.1090/s0273-0979-99-00796-x .
  5. ^ Hammersley, John (1972). Algunas semillas de investigación . Proc. Sexta edición de Berkeley Symp. Matemáticas, estadística y probabilidad. Vol. 1. University of California Press. págs. 345–394.
  6. ^ Mallows, CL (1973). "Clasificación por paciencia". Bull. Inst. Math. Appl . 9 : 216–224.
  7. ^ Kass, Steve (30 de abril de 2002). «Statistical Process Control». SQL Server Pro . Consultado el 23 de abril de 2014 .