¿El peor caso


35

Tengo problemas para encontrar buenos recursos que den el peor de los casos en su lugar estableO(norteEnnorte) algoritmo de clasificación . ¿Alguien sabe de algún buen recurso?

Solo un recordatorio, en su lugar significa que usa la matriz que se pasa y el algoritmo de clasificación solo puede usar espacio adicional constante. Estable significa que los elementos con la misma clave aparecen en el mismo orden en la matriz ordenada que en el original.

Por ejemplo, el tipo de fusión ingenuo es el peor de los casos y estable, pero usa espacio adicional O ( n ) . La clasificación rápida estándar puede estabilizarse, está en su lugar pero es el peor de los casos O ( n 2 ) . Heapsort está en su lugar, el peor de los casos O ( n ln n ) pero no es estable. Wikipedia tiene un buen cuadro de qué algoritmos de clasificación tienen qué inconvenientes. Observe que no hay un algoritmo de clasificación que enumeren que tenga las tres condiciones de estabilidad, el peor de los casos O ( n ln )O(norteEnnorte)O(norte)O(norte2)O(norteEnnorte)O(norteEnnorte) y estar en su lugar.

Encontré un artículo llamado " Combinación práctica en el lugar" por Katajainen, Pasanen y Teuhola, que afirma tener una variante de combinación estable en el peor de los casos . Si entiendo sus resultados correctamente, usan mergesort recursivamente en el primer 1O(norteEnnorte) de la matriz y el último114 4 de la matriz y usar el segundo112 como espacio de cero para hacer la fusión. Todavía estoy leyendo esto, así que se agradece más información sobre si estoy interpretando sus resultados correctamente.14 4

También estaría muy interesado en el peor de los casos en su lugar, quicksort estable. Por lo que entiendo, modificar el ordenamiento rápido para que sea el peor de los casos O ( n ln n ) requiere seleccionar un pivote adecuadoO(norteEnnorte)O(norteEnnorte) que destruiría la estabilidad de la que normalmente disfrutaría.

Esto es puramente de interés teórico y no tengo ninguna aplicación práctica. Solo me gustaría conocer el algoritmo que tiene estas tres características.


Hay una pregunta similar sobre SO aquí con una respuesta que da la referencia que proporcioné en la pregunta. Creo que esta no es una pregunta duplicada ya que solicito más aclaraciones, más literatura y, con suerte, una descripción del algoritmo.
user834

1
Vea esta pregunta en math.stackexchange.com.
Tsuyoshi Ito

¿Por qué una forma diferente de seleccionar un pivote en QuickSort destruiría su estabilidad?
svick

@svick, la única forma en que sé cómo hacer que QuickSort sea el peor de los casos es elegir el pivote de forma más inteligente que aleatoria. La forma en que aprendí a hacer eso fue usando el algoritmo de selección, que usa el algoritmo de mediana de medianas, que destruye la estabilidad. Si me perdí algo, hágamelo saber. O(norteEnnorte)
user834

@ TsuyoshiIto, considera hacer de esto una respuesta. Además, si pudiera dar un breve esbozo del algoritmo, creo que eso también sería útil.
user834

Respuestas:


6

Hay varios algoritmos que son todos los anteriores, y casi todos han sido inventados en los últimos 30 años.

Probablemente la mejor es la clase de algoritmos llamados Bloque de clasificación , incluida la versión (llamada WikiSort) de Kim y Kutzner en 2008. No solo es estable y está completamente en su lugar (O (1) sobrecarga de memoria en el modelo transdicotómico), también es adaptable y, por lo tanto, tomará menos pasos para ordenar listas casi ordenadas, convergiendo a comparaciones O (n) en el caso de una lista ya ordenada. Puede encontrar una implementación en C, C ++ y Java aquí: https://github.com/BonzaiThePenguin/WikiSort

También es interesante el algoritmo GrailSort (también un tipo de bloque) de Huang y Langston (1989-1992), que en realidad supera a WikiSort en varios tipos de casos de prueba. Una implementación de C ++ está disponible aquí: https://github.com/Mrrl/GrailSort


8

Puede escribir un mergesort estable en el lugar. Vea esto para más detalles. En las propias palabras del autor:

Un hermoso en el lugar - algoritmo de fusión. Pruébelo en matrices invertidas para comprender cómo funcionan las rotaciones. Más rápido conocido en su lugar estable tipo. No hay riesgo de explotar una pila. Costo: un número relativamente alto de movimientos. La pila también puede ser costosa. Este es un tipo de fusión con una fusión inteligente en el lugar que 'rota' las submatrices. Este código se copia literalmente de la biblioteca stl de C ++ y se traduce en Java.

No copiaré el código aquí, pero puede encontrarlo en el enlace o marcando el STL de C ++. Avíseme si desea que intente proporcionar una descripción más detallada de lo que está sucediendo aquí.


8
O(Ennorte)O(1)O(Ennorte)

Knuth también aborda esto en TAoCP.
Raphael

O(norteEn2norte)

1

Tome esto como un largo comentario sobre algunos pensamientos prácticos. Aunque esta no es una respuesta a su pregunta, creo que podría estar interesado en esta discusión de Python:

lg(norte!)norte-1 ), pero tan rápido como el híbrido de muestra y sintonización altamente afinado previo de Python en matrices aleatorias.

[...]

Fusionar tramos adyacentes de longitudes A y B en el lugar es muy difícil . Se sabe que las construcciones teóricas pueden hacerlo, pero son demasiado difíciles y lentas para un uso práctico . Pero si tenemos memoria temporal igual a min (A, B), es fácil.

Fuente: bugs.python.org , autor: Tim Peters

O(norteIniciar sesiónnorte) tipo de combinación de complejidad de tiempo en el peor de los casos .

También tenga en cuenta que Timsort funciona bien en arreglos ya ordenados.

Entonces, Python utiliza Timsort (que es Mergesort con algunos ajustes) y, como he buscado la implementación de Java hace algunos años, también fue Mergesort (creo que ahora también usan Timsort).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.