2011-08-15 5 views
5

모든 ..Values 기능은 옵션 Sort을 문서화 한 :값의 "정렬"옵션은 무엇입니까?

이 옵션은 어느 목적을 위해 유용하게 사용될 수 있습니다 무엇을
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}} 

?

답변

8

함수에 대한 정의를 입력 할 때 특정 순서로 입력하십시오. 정의에 패턴이 포함되어 있지 않은 경우 내부적으로 해시 테이블에 저장됩니다. 요청할 때 기본적으로 정렬됩니다.

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} 

그러나 값이 할당 된 원래 순서를보고 싶을 때가 있습니다. 당신이 캐시 (이 옵션에 따라 그렇게 내 시도 here을 찾을 수 있습니다)를 구현해야 할 때

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

당신이 그것을 사용할 수 있습니다 하나 개의 인스턴스의 예입니다 : 여기에 방법이다. 그러나 많은 수의 정의의 경우 내부 해시 테이블이 확장되어 여러 번 다시 해독 될 것이므로 정의가 원래 순서대로 유지되는 것은 아닙니다. 일반적으로 해시 테이블 구현은 키 - 값 쌍이 저장되는 순서를 보장하지 않습니다. 따라서 Sort->False으로 설정하면 ...Values이 반환되기 전에 Mathematica에서 정렬되지 않으므로 Mathematica가 현재 저장 한 순서대로 표시됩니다.

또 다른 경우는 DownValues을 사용하여 사전 형 구조를 만들려는 경우입니다.이 경우 키 집합에 대한 정렬을 수행하지 않아도되므로 Sort->False으로 키 추출이 훨씬 빠릅니다 대형 키 세트 관련 사항) :

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}} 

here.

지금까지 내가 아는 한, Sort 옵션은 영향을

비 패턴 기반 DownValues (및 기타 ...Values를) 때문에 패턴 기반 DownValues 티카 어쨌든 이해로, 그 보편성의 순서대로 순서를 변경 시도에 대한 그. OTOH의 경우 패턴 기반 DownValues의 경우 수동 규칙 재정렬을 수행 할 수 있습니다. Mathematica는 변경 사항을 유지하지만 패턴이없는 정의의 경우 정의를 수동으로 재정렬하려는 시도는 처음에 부여한 후에 수동으로 재정렬하려고 시도합니다 (아마도 다시 내부적으로 해시되고 해시 테이블은 일반적으로 주문에 대해 신경 쓰지 않습니다.)

+1

"... 내부 해시 테이블이 확장되어 여러 번 다시 확장되기 때문에"에 약간 확장 할 수 있습니까? – acl

+2

@acl 일반적인 해시 테이블에는 특정 용량이 있습니다. 충돌 가능성이 너무 높아지면서 효과적으로 해싱 할 수있는 요소가 많습니다. 정의를 계속 추가 할 때 해시 테이블은 동적 크기 조정을 수행하여 용량을 늘릴 수 있습니다. 구현에 따라 기존 항목을 다시 해시해야 할 수도 있고하지 않을 수도 있습니다. 이러한 것들은 http://en.wikipedia.org/wiki/Hash_table에서 아주 잘 설명되어 있습니다. 대부분의 해시 테이블은 키의 순서를 유지하지 않지만 일부는 (예 : Java에서'LinkedHashMap') 할 수 있습니다. 덕분에 –

+0

. 나는 당신이 이것을하고 있는지, 그리고 만약 그렇다면 어떻게 지켜 봤는지 더 묻고 있었다고 생각한다. – acl

관련 문제