2011-08-15 13 views
5

सभी ..Values कार्यों विकल्प Sort undocumented हैक्या "सॉर्ट करें" विकल्प ... मान करता है?

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} 

हालांकि, अक्सर आप मूल ऑर्डर देखना चाहते हैं जिसमें मान असाइन किए गए थे।

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

एक उदाहरण जहां आप इसे उपयोग कर सकते हैं का एक उदाहरण है, जब आप एक कैश (इस विकल्प के आधार पर करने के लिए मेरे प्रयास पाया जा सकता है here) लागू करने की आवश्यकता है: यहां बताया गया है। हालांकि, बड़ी संख्या में परिभाषाओं के लिए, शायद यह गारंटी नहीं दी जाती है कि परिभाषाएं मूल क्रम में लागू होंगी, क्योंकि आंतरिक हैश-टेबल शायद विस्तारित हो जाएंगे और कई बार पुनर्स्थापित किए जाएंगे। आम तौर पर, हैश टेबल कार्यान्वयन उस क्रम की गारंटी नहीं देता है जिसमें कुंजी-मूल्य जोड़े संग्रहीत किए जाते हैं। तो, Sort->False सेट करके आप जो हासिल करते हैं वह यह है कि ...Values गणित द्वारा आपके द्वारा वापस आने से पहले क्रमबद्ध नहीं किया जाता है, इसलिए आप उन्हें क्रमशः संग्रहित करते हैं, गणितिका उन्हें संग्रहीत करता है।

एक और मामला है जब आप इस चाहते हो सकता है जब आप एक शब्दकोश की तरह संरचना 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 मेथेमेटिका वैसे भी, उनकी व्यापकता के क्रम में उन्हें पुन: व्यवस्थित करने के लिए के रूप में यह समझता है प्रयास करता है के लिए उस। ओटीओएच, पैटर्न-आधारित DownValues के लिए, आप मैन्युअल नियम रीडरिंग कर सकते हैं और गणित आपके परिवर्तनों को बनाए रखेगा, जबकि पैटर्न के बिना परिभाषाओं के लिए, मूल रूप से दिए जाने के बाद मैन्युअल रूप से परिभाषाओं को पुन: व्यवस्थित करने का प्रयास उन पर कोई प्रभाव नहीं पड़ता है (शायद, फिर से वे आंतरिक रूप से धोए जाते हैं, और हैश-टेबल आमतौर पर आदेश के बारे में परवाह नहीं करते हैं)।

+1

क्या आप थोड़ा सा विस्तार कर सकते हैं "... क्योंकि आंतरिक हैश-टेबल शायद विस्तारित हो जाएंगे और कई बार रीहाश किए जाएंगे"? – acl

+2

@ एसीएल एक विशिष्ट हैश-टेबल की एक निश्चित क्षमता है - टकराव की संभावना के बिना कई तत्व प्रभावी रूप से हैश हो सकते हैं। जब हम परिभाषाओं को जोड़ते रहते हैं, तो कुछ बिंदु पर हैश-टेबल गतिशील आकार बदलने की संभावना है, इसकी क्षमता में वृद्धि। कार्यान्वयन के आधार पर, मौजूदा प्रविष्टियों को फिर से स्थापित करने की आवश्यकता हो सकती है या नहीं। इन चीजों को यहां बहुत अच्छी तरह से समझाया गया है: http://en.wikipedia.org/wiki/Hash_table। अधिकांश हैश टेबल कुंजी के क्रम को बनाए नहीं रखते हैं, लेकिन कुछ हैं (उदा। जावा में 'लिंक्ड हैश मैप') जो करते हैं। –

+0

धन्यवाद। मुझे लगता है कि मैं और पूछ रहा था कि क्या आपने एमएमए ऐसा किया है और, यदि हां, तो कैसे। – acl

संबंधित मुद्दे