java - for - Grokking Timsort
timsort python code (2)
Citando la parte relevante de una publicación de blog ahora eliminada: Visualización de algoritmos de ordenación: Timsort de Python
El fin del negocio de timsort es una combinación que opera en corridas de elementos pre-ordenados. Se elige un minrun de longitud de ejecución mínima para asegurarse de que las fusiones finales estén lo más equilibradas posible: para 64 elementos, la minrun es 32. Antes de que empiecen las fusiones, se realiza una sola pasada a través de los datos para detectar corridas preexistentes elementos. Las carreras descendentes se manejan simplemente invirtiéndolas en su lugar. Si la longitud de ejecución resultante es menor que minrun, se impulsa a minrun mediante la ordenación por inserción. En una matriz aleatoria que no tiene ejecuciones preexistentes significativas, este proceso se ve exactamente como lo hicimos con la suposición anterior: la clasificación previa de los bloques de elementos minrun se realiza mediante la ordenación por inserción, antes de fusionarlos con la ordenación por fusión.
[...]
- timsort encuentra una ejecución descendente e invierte la ejecución en el lugar. Esto se hace directamente en el conjunto de punteros, por lo que parece "instantáneo" desde nuestro punto de vista.
- La ejecución ahora se ha incrementado a la duración del minrun utilizando la ordenación por inserción.
- No se detecta ninguna ejecución al comienzo del siguiente bloque, y la ordenación por inserción se usa para ordenar todo el bloque. Tenga en cuenta que los elementos ordenados en la parte inferior de este bloque no se tratan de manera especial; timsort no detecta las ejecuciones que comienzan en medio de los bloques que se impulsan para minrun.
- Por último, mergesort se utiliza para combinar las ejecuciones.
Hay un tipo (relativamente) nuevo en el bloque llamado Timsort. Se ha utilizado como list.sort de Python, y ahora será el nuevo Array.sort en Java 7 .
Hay algo de documentación y un pequeño artículo de Wikipedia que describe las propiedades de alto nivel del tipo y algunas evaluaciones de rendimiento de bajo nivel, pero tenía curiosidad de que alguien pudiera proporcionar algún pseudocódigo para ilustrar qué está haciendo Timsort exactamente y cuáles son las cosas clave Eso lo hace zippy. (Esp. Con respecto al artículo citado, "Clasificación optimista y complejidad de la teoría de la información").
(Ver también la publicación relacionada StackOverflow ).
Este cambio pasó a través de la lista de correo de core-libs cuando entró, por lo que hay una discusión y enlaces útiles allí. Aquí está la revista web con cambios de revisión de código y también el parche original .
Los comentarios en el código dicen:
Nota de implementación: esta implementación es estable, adaptable,
combinación iterativa que requiere mucho menos que n lg (n) comparaciones
cuando la matriz de entrada está parcialmente ordenada, mientras que ofrece la
rendimiento de una combinación tradicional cuando la matriz de entrada es
ordenados al azar Si la matriz de entrada está casi ordenada,
La implementación requiere aproximadamente n comparaciones.
Los requisitos de almacenamiento temporal varían desde una pequeña constante para casi ordenados
Matrices de entrada a n / 2 referencias de objeto para entrada ordenada aleatoriamente
matricesLa implementación toma igual ventaja de ascender y
orden descendente en su matriz de entrada, y puede aprovechar
Orden ascendente y descendente en diferentes partes del mismo.
matriz de entrada. Se adapta bien a la combinación de dos o más matrices ordenadas:
simplemente concatene las matrices y ordene la matriz resultante.
La implementación fue adaptada de la lista de Tim Peters para Python
TimSort . Utiliza técnicas de Peter McIlroy''s "Optimistic
Clasificación y complejidad de la teoría de la información ", en Procedimientos de la
Cuarto Simposio Anual ACM-SIAM sobre Algoritmos Discretos, pp 467-474,
Enero de 1993.
Enterrado allí está el enlace muy útil a los detalles de la implementación de Python , y creo que es un buen lugar para comenzar, seguido del código. Para tener un nivel increíblemente alto al respecto, timsort mejora el rendimiento al observar ejecuciones de datos ordenados y aprovechar esa estructura durante la clasificación.