यह एक नकल के रूप में बंद होने से पहले पायथन 3.41 ए सेट के लिए अधिक प्रतिक्रिया है ।
अन्य सही हैं: आदेश पर भरोसा नहीं करते। वहाँ भी दिखावा मत करो एक है।
उस ने कहा, वहाँ है एक चीज है जिस पर आप भरोसा कर सकते हैं:
list(myset) == list(myset)
अर्थात्, आदेश है स्थिर है ।
समझ क्यों वहाँ एक है कथित आदेश को समझने के लिए कुछ चीजों को समझने की आवश्यकता है:
वह पायथन उपयोग करता है हैश सेट उपयोग करता है ,
कैसे CPython हैश सेट स्मृति में संग्रहीत किया जाता है और
कैसे नंबर मिलते हैं
ऊपर से:
ए हैश सेट वास्तव में तेजी से देखने के समय के साथ यादृच्छिक डेटा संग्रहीत करने की एक विधि है।
इसका एक बैकिंग ऐरे है:
# A C array; items may be NULL,
# a pointer to an object, or a
# special dummy object
_ _ 4 _ _ 2 _ _ 6
हम उस विशेष डमी ऑब्जेक्ट को अनदेखा करेंगे, जो केवल हटाने के लिए ही आसान है, क्योंकि हम इन सेटों से नहीं हटाएंगे।
वास्तव में तेजी से देखने के लिए, आप किसी वस्तु से हैश की गणना करने के लिए कुछ जादू करते हैं। एकमात्र नियम यह है कि दो वस्तुएं जो समान हैं उनमें समान हैश है। (लेकिन अगर दो वस्तुओं में एक ही हैश हो तो वे असमान हो सकते हैं।)
फिर आप सरणी लंबाई द्वारा मापांक लेते हुए सूचकांक बनाते हैं:
hash(4) % len(storage) = index 2
यह तत्वों तक पहुंचने के लिए वास्तव में तेज़ बनाता है।
हश्र केवल कहानी के अधिकांश हैं, जैसा कि hash(n) % len(storage)
और hash(m) % len(storage)
समान संख्या में परिणाम कर सकते हैं। उस स्थिति में, कई अलग-अलग रणनीतियाँ संघर्ष की कोशिश कर सकती हैं और हल कर सकती हैं। सीपीथॉन जटिल चीजों को करने से पहले 9 बार "रैखिक जांच" का उपयोग करता है, इसलिए यह स्लॉट के बाईं ओर दिखेगा पहले 9 स्थानों तक ।
सीपीथॉन के हैश सेट को इस तरह संग्रहीत किया जाता है:
एक हैश सेट 2/3 से अधिक पूर्ण नहीं हो सकता है । यदि 20 तत्व हैं और समर्थन सरणी 30 तत्वों की है, तो बैकिंग स्टोर बड़ा होने का आकार देगा। इसका कारण यह है कि आपको छोटे बैकिंग स्टोर के साथ अधिक बार टकराव मिलते हैं, और टकराव सब कुछ धीमा कर देते हैं।
बैकिंग स्टोर 4 की शक्तियों में आकार लेता है, 8 से शुरू होता है, बड़े सेट (50k तत्वों) को छोड़कर जो दो: (8, 32, 128, ...) की शक्तियों में आकार लेते हैं।
इसलिए जब आप एक सरणी बनाते हैं, तो बैकिंग स्टोर की लंबाई 8 होती है। जब यह 5 पूर्ण होता है और आप एक तत्व जोड़ते हैं, तो इसमें संक्षेप में 6 तत्व होंगे। 6 > ²⁄₃·8
तो यह एक आकार को ट्रिगर करता है, और बैकिंग स्टोर चौगुनी आकार 32 के लिए।
अंत में, hash(n)
केवल n
संख्याओं के लिए रिटर्न ( -1
जो विशेष है) को छोड़कर ।
तो, चलो पहले एक को देखते हैं:
v_set = {88,11,1,33,21,3,7,55,37,8}
len(v_set)
10 है, इसलिए सभी आइटम जोड़े जाने के बाद बैकिंग स्टोर कम से कम 15 (+1) है । 2 की प्रासंगिक शक्ति 32 है। इसलिए समर्थन स्टोर है:
__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
हमारे पास है
hash(88) % 32 = 24
hash(11) % 32 = 11
hash(1) % 32 = 1
hash(33) % 32 = 1
hash(21) % 32 = 21
hash(3) % 32 = 3
hash(7) % 32 = 7
hash(55) % 32 = 23
hash(37) % 32 = 5
hash(8) % 32 = 8
इसलिए ये सम्मिलित करें:
__ 1 __ 3 __ 37 __ 7 8 __ __ 11 __ __ __ __ __ __ __ __ __ 21 __ 55 88 __ __ __ __ __ __ __
33 ← Can't also be where 1 is;
either 1 or 33 has to move
तो हम जैसे आदेश की उम्मीद करेंगे
{[1 or 33], 3, 37, 7, 8, 11, 21, 55, 88}
1 या 33 के साथ जो शुरू में कहीं और नहीं है। यह रैखिक जांच का उपयोग करेगा, इसलिए हमारे पास या तो होगा:
↓
__ 1 33 3 __ 37 __ 7 8 __ __ 11 __ __ __ __ __ __ __ __ __ 21 __ 55 88 __ __ __ __ __ __ __
या
↓
__ 33 1 3 __ 37 __ 7 8 __ __ 11 __ __ __ __ __ __ __ __ __ 21 __ 55 88 __ __ __ __ __ __ __
आप उम्मीद कर सकते हैं कि 33 वही होगा जो कि विस्थापित हो चुका है क्योंकि 1 पहले से ही था, लेकिन आकार बदलने के कारण जो सेट बनाया जा रहा है, वास्तव में ऐसा नहीं है। हर बार जब सेट का पुनर्निर्माण होता है, तो पहले से जोड़े गए आइटम प्रभावी रूप से फिर से व्यवस्थित हो जाते हैं।
अब आप देख सकते हैं क्यों
{7,5,11,1,4,13,55,12,2,3,6,20,9,10}
क्रम में हो सकता है। 14 तत्व हैं, इसलिए बैकिंग स्टोर कम से कम 21 + 1 है, जिसका अर्थ है 32:
__ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
पहले 13 स्लॉट में 1 से 13 हैश। 20 स्लॉट 20 में जाता है।
__ 1 2 3 4 5 6 7 8 9 10 11 12 13 __ __ __ __ __ __ 20 __ __ __ __ __ __ __ __ __ __ __
55 स्लॉट में जाता है hash(55) % 32
जो 23 है:
__ 1 2 3 4 5 6 7 8 9 10 11 12 13 __ __ __ __ __ __ 20 __ __ 55 __ __ __ __ __ __ __ __
अगर हमने इसके बजाय 50 को चुना, तो हम उम्मीद करेंगे
__ 1 2 3 4 5 6 7 8 9 10 11 12 13 __ __ __ __ 50 __ 20 __ __ __ __ __ __ __ __ __ __ __
और लो और निहारना:
{1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 20, 50}
#>>> {1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 50, 20}
pop
चीजों की नज़र से काफी सरलता से लागू किया जाता है: यह सूची का पता लगाता है और पहले वाले को पॉप करता है।
यह सभी कार्यान्वयन विवरण है।