Recientemente leí sobre quicksort y me preguntaba si sería inteligente crear mi propia función para ordenar cosas con quicksort o si sería ineficaz. ¿Cuál cree que es la función de ordenamiento incorporada mejor que una función de quicksort autoconstruida?Construcción de quicksort con php
Respuesta
Nota : Como la mayoría de las funciones de clasificación PHP , sort() utiliza una implementación de »Quicksort.
funciones PHP
el núcleo serán implementados en C, en lugar de PHP, por lo que generalmente deben ser significativamente más rápido que cualquier cosa que usted mismo puede escribir en PHP. Habrá casos en los que sea más rápido escribir uno propio, pero supongo que esto sería cuando tienes un caso muy específico y puedes hacer tus propias optimizaciones específicas para eso. Creo que es poco probable que sea el caso aquí.
Se pega con la función de clasificación incorporada. Quicksort es un algoritmo simple, pero para obtener un buen rendimiento en las computadoras que realmente están en uso se requiere un poco de delicadeza. Es más que probable que la función incorporada ya esté más optimizada que cualquier cosa que escribiría en un período de tiempo razonable. (La aceleración de factor constante por estar escrita en C en lugar de PHP también es útil).
Si está ordenando tantos elementos que la función de clasificación le ralentiza, probablemente esté haciendo algo mal. (Esto es PHP después de todo. Usted debe usar un lenguaje de propósito general para el procesamiento de datos intensivos. Será más fácil escribir el código, y se ejecutará más rápido.)
De hecho, hice esto para obtener un punto de datos sobre una presentación que estoy reuniendo. La prueba ordena una matriz de 250,000 enteros utilizando la función de clasificación nativa y una implementación del algoritmo de quicksort escrito en php. El contenido de la matriz es exactamente el mismo para ambas ejecuciones, los datos se asignan al azar, y la hora informada es solo para realizar el ordenamiento, no otro procesamiento necesario para invocar al intérprete de php.
Resultados:
Native sort implementation: 1.379 seconds PHP quicksort implementation: 30.615 seconds
Definitivamente el uso de la aplicación nativa. Ese debería ser el caso para cualquier lenguaje interpretado.
Los resultados para los otros idiomas que probé con las mismas condiciones utilizando la misma aplicación en el mismo hardware y el sistema operativo, proporcionan una comparación de rendimiento interesante y poner el resultado de PHP en perspectiva:
C: 0.107 seconds Java: 0.250 seconds JavaScript (FF3): 4.401 seconds
Notablemente, cromo y Safari realizó mucho más rápido para la prueba de JavaScript, pero no los incluyo aquí porque esas pruebas se grabaron en un entorno diferente.
Como referencia hay una aplicación PHP aquí:
http://en.wikibooks.org/wiki/Algorithm_implementation/Sorting/Quicksort#C.23
Una cosa acerca de la clase php rápida (asort, arsort, etc) es que echan a perder sus valores iguales, es decir, que los valores con diferentes teclas intercambiará la posición al azar, incluso entre diferentes ejecuciones. Sorprende que el código pueda producir un orden diferente usando los mismos datos una y otra vez. Al final tuve que implementar mi propia clasificación rápida para eliminar esta anomalía.
Simplemente por diversión, he aquí una versión local de quicksort en PHP que se me ocurrió. El truco aquí es pasar la matriz para ordenarla como referencia.
function partition(&$arr,$leftIndex,$rightIndex)
{
$pivot=$arr[($leftIndex+$rightIndex)/2];
while ($leftIndex <= $rightIndex)
{
while ($arr[$leftIndex] < $pivot)
$leftIndex++;
while ($arr[$rightIndex] > $pivot)
$rightIndex--;
if ($leftIndex <= $rightIndex) {
$tmp = $arr[$leftIndex];
$arr[$leftIndex] = $arr[$rightIndex];
$arr[$rightIndex] = $tmp;
$leftIndex++;
$rightIndex--;
}
}
return $leftIndex;
}
function quickSort(&$arr, $leftIndex, $rightIndex)
{
$index = partition($arr,$leftIndex,$rightIndex);
if ($leftIndex < $index - 1)
quickSort($arr, $leftIndex, $index - 1);
if ($index < $rightIndex)
quickSort($arr, $index, $rightIndex);
}
- 1. Php clase dinámica construcción
- 2. Quicksort con partición de 3 vías
- 3. Quicksort pivote
- 4. implementación de quicksort
- 5. Algoritmo de partición QuickSort
- 6. Problema con quicksort paralelo en erlang
- 7. Aprendiendo LINQ: QuickSort
- 8. Quicksort multiproceso o mergesort
- 9. Lazy Quicksort en Scala
- 10. ¿std :: sort implementa Quicksort?
- 11. Comparación entre timsort y quicksort
- 12. Buildout con construcción de parte con Cython
- 13. Ordenando por el placer - Quicksort
- 14. Quicksort más lento que Mergesort?
- 15. C# quicksort funcional está fallando
- 16. ¿Qué es un Quicksort determinístico?
- 17. Construcción de clase anónima
- 18. Observación del comportamiento cuadrático con quicksort - O (n^2)
- 19. ¿Cómo se relaciona el quicksort con el caché?
- 20. ¿Es esta una implementación correcta de quicksort?
- 21. Programa de algoritmo Quicksort en Java
- 22. PHP velocidad - Muchas Echos vs La construcción de una cadena
- 23. Frasco de construcción con maven-scala-plugin
- 24. Construcción de clase con valores iniciales
- 25. Quicksort: ¿qué subparte debería ordenarse primero?
- 26. Quicksort: condiciones que lo hacen estable
- 27. Quicksort ordena números más grandes más rápido?
- 28. ¿Cómo envolver una construcción Ant con Maven?
- 29. detener la construcción automática con maven/eclipse
- 30. Python quicksort - Lista de comprensión vs Recursion (rutina de partición)
haciendo eso en php es muy lento - hay mejores formas de resolver este problema. – Chronial