함수에 대한 정의를 입력 할 때 특정 순서로 입력하십시오. 정의에 패턴이 포함되어 있지 않은 경우 내부적으로 해시 테이블에 저장됩니다. 요청할 때 기본적으로 정렬됩니다.
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는 변경 사항을 유지하지만 패턴이없는 정의의 경우 정의를 수동으로 재정렬하려는 시도는 처음에 부여한 후에 수동으로 재정렬하려고 시도합니다 (아마도 다시 내부적으로 해시되고 해시 테이블은 일반적으로 주문에 대해 신경 쓰지 않습니다.)
"... 내부 해시 테이블이 확장되어 여러 번 다시 확장되기 때문에"에 약간 확장 할 수 있습니까? – acl
@acl 일반적인 해시 테이블에는 특정 용량이 있습니다. 충돌 가능성이 너무 높아지면서 효과적으로 해싱 할 수있는 요소가 많습니다. 정의를 계속 추가 할 때 해시 테이블은 동적 크기 조정을 수행하여 용량을 늘릴 수 있습니다. 구현에 따라 기존 항목을 다시 해시해야 할 수도 있고하지 않을 수도 있습니다. 이러한 것들은 http://en.wikipedia.org/wiki/Hash_table에서 아주 잘 설명되어 있습니다. 대부분의 해시 테이블은 키의 순서를 유지하지 않지만 일부는 (예 : Java에서'LinkedHashMap') 할 수 있습니다. 덕분에 –
. 나는 당신이 이것을하고 있는지, 그리고 만약 그렇다면 어떻게 지켜 봤는지 더 묻고 있었다고 생각한다. – acl