2011-08-15 23 views
5

Todas las funciones han ..Values indocumentado opción Sort:¿Qué opción "Ordenar" de ... Valores tiene?

In[1]:= Options /@ {OwnValues, DownValues, UpValues, SubValues, 
    DefaultValues, FormatValues, NValues} 

Out[1]= {{Sort -> True}, {Sort -> True}, {Sort -> True}, {Sort -> 
    True}, {Sort -> True}, {Sort -> True}, {Sort -> True}} 

Lo que esta opción no y con qué fines puede ser útil?

Respuesta

8

Cuando ingresa sus definiciones para una función, las ingresa en un orden en particular. En caso de que sus definiciones no contengan patrones, se almacenan internamente en una tabla hash. Cuando se les solicite, serán ordenados por defecto:

In[11]:= 
Clear[g]; 
g[5]=1; 
g[4]=2; 
g[3]=3; 

In[15]:= DownValues[g] 
Out[15]= {HoldPattern[g[3]]:>3,HoldPattern[g[4]]:>2,HoldPattern[g[5]]:>1} 

Sin embargo, a menudo es posible que desee ver el orden original en el que fueron asignados los valores. Aquí es cómo:

In[16]:= DownValues[g,Sort->False] 
Out[16]= {HoldPattern[g[5]]:>1,HoldPattern[g[4]]:>2,HoldPattern[g[3]]:>3} 

Un ejemplo de un caso en que es posible que desee utilizarlo, es cuando es necesario implementar una memoria caché (mi intento de hacer que en base a esta opción se puede encontrar here). Sin embargo, para un gran número de definiciones, probablemente no esté garantizado que las definiciones sigan en el orden original, ya que las tablas hash internas probablemente se expandirán y repetirán varias veces. Genéricamente, una implementación de la tabla hash no garantiza el orden en que se almacenan los pares clave-valor. Entonces, lo que logra al establecer Sort->False es que el ...Values no está ordenado por Mathematica antes de que se le devuelvan, por lo que los obtendrá prácticamente en el orden en que Mathematica actualmente los almacena.

Otro caso en el que es posible que desee esto es cuando se quiere construir una estructura de diccionario-como el uso de DownValues - en este caso, la extracción de clave será mucho más rápido con Sort->False, ya que no hay que separar en el conjunto de claves tiene que ser realizada (cuestiones para grandes conjuntos de llaves):

In[31]:= 
Clear[gg]; 
(gg[#]:=200000-#)&/@Range[200000]; 

In[33]:= DownValues[gg][[All,1,1,1]]//Short//Timing 
Out[33]= {4.867,{1,2,3,<<199994>>,199998,199999,200000}} 

In[34]:= DownValues[gg,Sort->False][[All,1,1,1]]//Short//Timing 
Out[34]= {2.103,{95090,102286,<<199996>>,38082,26686}} 

Puede encontrar un ejemplo de dicho uso, por ejemplo here.

Por lo que yo sé, la opción Sort sólo afecta a la DownValues (y otra ...Values) no basado en patrones, porque para basada en patrones DownValues Mathematica intenta de todos modos para cambiar su orden en el orden de su generalidad, ya que entiende ese. OTOH, para el modelo DownValues, puede hacer un reordenamiento manual de las reglas y Mathematica conservará los cambios, mientras que para las definiciones sin patrones, los intentos de reordenar las definiciones manualmente después de que se dieron originalmente parecen no tener ningún efecto sobre ellos (quizás, de nuevo porque son hash internamente, y hash-tables generalmente no se preocupan por el orden).

+1

¿podría ampliar un poco sobre "... ya que las tablas de hash internas probablemente se expandirán y se repetirán varias veces"? – acl

+2

@acl Una tabla hash típica tiene cierta capacidad: una cantidad de elementos que puede hacer hash efectivamente sin que la probabilidad de colisión sea demasiado alta. Cuando seguimos agregando definiciones, en algún punto es probable que la tabla hash realice un redimensionamiento dinámico, aumentando su capacidad. Puede o no necesitar volver a codificar las entradas existentes, dependiendo de la implementación. Estas cosas se explican muy bien aquí: http://en.wikipedia.org/wiki/Hash_table. La mayoría de las tablas hash no mantienen el orden de las claves, pero hay algunas (por ejemplo, 'LinkedHashMap' en Java) que sí lo hacen. –

+0

gracias. Supongo que preguntaba más si has observado que mma está haciendo esto y, en caso afirmativo, cómo. – acl

Cuestiones relacionadas