Transformada de Schwartz

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 26 de febrero de 2017; las comprobaciones requieren 2 ediciones .

La transformada de Schwartz  es una expresión idiomática que apareció en el lenguaje de programación Perl que resuelve el problema de ordenar de manera eficiente las listas de elementos por atributos complejos (computados).

La idea es comparar los atributos de los elementos calculados (por ejemplo, la longitud de la cadena, la parte de la cadena, el cuadrado numérico, otras fórmulas y consultas externas) para que se calculen una vez para todos los elementos y se coloquen en una matriz temporal, que luego se clasifica mediante la función de clasificación estándar. de acuerdo con estos resultados, después de lo cual se descartan los datos temporales. De hecho, esto es almacenamiento en caché (almacenamiento temporal) de atributos calculados, ya que se usan repetidamente durante el proceso de clasificación (al comparar elementos). En el lenguaje Perl , gracias al uso de una "variable por defecto", este algoritmo encaja en una expresión de tres funciones, es decir, de forma muy breve y clara.

El idioma toma su nombre de Randel Schwartz , quien lo demostró algún tiempo después del lanzamiento de Perl 5 en 1994 . El término "transformación de Schwartz" se usó exclusivamente para el lenguaje de programación Perl durante muchos años, pero esta transformación fue posteriormente adaptada por otros programadores a otros lenguajes (como Python ) también. El algoritmo utilizado en la transformada de Schwartz existía en algunos lenguajes de programación (sin un nombre específico) antes de que se popularizara como modismo en la comunidad de programación de Perl.

Ejemplo

Supongamos que queremos ordenar una lista de palabras ("aaaa", "a", "aa") por longitud de palabra. Primero debe crear una lista (["aaaa",4], ["a",1], ["aa",2]), luego ordenarla por valor numérico y luego de la lista resultante (["a ",1] , ["aa",2], ["aaaa",4]) eliminar números. El resultado será una lista ("a", "aa", "aaaa"). El algoritmo descrito se escribe como una transformación de Schwartz de la siguiente manera:

@sorted = map { $_ -> [ 0 ] } sort { $a -> [ 1 ] <=> $b -> [ 1 ] } # comparación numérica map { [ $_ , length ( $_ )] } # cálculo de longitud de cadena @unsorted ;