2012-09-17 16 views
7

स्कैला के वैक्टरों के पीछे 32 का ब्रांचिंग कारक होने के पीछे तर्क क्या है, और कुछ अन्य नंबर नहीं है? छोटे शाखाओं के कारक अधिक संरचनात्मक साझाकरण सक्षम नहीं करेंगे? क्लोजर एक ही ब्रांचिंग कारक का उपयोग करता प्रतीत होता है। क्या ब्रांचिंग कारक 32 के बारे में कुछ जादू है जो मुझे याद आ रही है?वैक्टर इतने उथले क्यों हैं?

+7

मैं मुख्यधारा के मीडिया को दोष:

मैं आपको यह भी InfoQ पर इस प्रस्तुति, जहां डैनियल Spiewak की चर्चा वेक्टर में लगभग 30 मिनट के शुरू करने से देखने की सलाह देता। – Shmiddty

+0

अपने बेहतरीन पर Trolltember। – rlemon

उत्तर

13

यह मदद मिलेगी अगर आप विस्तार से बताया है कि एक शाखाओं में कारक है:

एक पेड़ या एक ग्राफ की शाखाओं में कारक प्रत्येक नोड में बच्चों की संख्या है।

तो, इस सवाल का जवाब काफी हद तक यहाँ प्रतीत होता है:

http://www.scala-lang.org/docu/files/collections-api/collections_15.html

वेक्टर एक उच्च शाखाओं में कारक के साथ पेड़ के रूप में प्रतिनिधित्व कर रहे हैं। प्रत्येक पेड़ नोड में वेक्टर के 32 तत्व होते हैं या 32 अन्य पेड़ नोड्स तक होते हैं। 32 तत्वों वाले वेक्टरों को एक एकल नोड में का प्रतिनिधित्व किया जा सकता है। 32 * 32 = 1024 तत्वों के साथ वेक्टर एक एकल संकेत के साथ प्रतिनिधित्व कर सकते हैं। अंतिम तत्व नोड के लिए पेड़ की जड़ से दो हॉप्स अप करने के लिए तत्वों, वैक्टर के लिए तीन हॉप्स 2 , चार हॉप्स साथ वैक्टर के लिए 2 तत्वों और साथ साथ वैक्टर के लिए पर्याप्त हैं वेक्टरों के लिए पांच हॉप 2 तत्वों के साथ। तो उचित आकार के सभी वैक्टरों के लिए, एक तत्व चयन में तक 5 आदिम सरणी चयन शामिल हैं। यह हमारा मतलब था जब हम ने लिखा था कि तत्व पहुंच "प्रभावी रूप से स्थिर समय" है।

इसलिए, मूल रूप से, उन्हें एक डिजाइन निर्णय लेना पड़ा कि प्रत्येक नोड में कितने बच्चे हैं। जैसा कि उन्होंने समझाया, 32 उचित लग रहा था, लेकिन, अगर आपको लगता है कि यह आपके लिए बहुत ही सीमित है, तो आप हमेशा अपनी कक्षा लिख ​​सकते हैं।

32 मई क्यों हो सकता है, इस बारे में अधिक जानकारी के लिए, आप इस पेपर को देख सकते हैं, जैसा कि परिचय में वे ऊपर के समान बयान देते हैं, लगभग यह लगभग स्थिर समय है, लेकिन यह पेपर क्लोजर से संबंधित है, ऐसा लगता है, स्कैला से अधिक।

http://infoscience.epfl.ch/record/169879/files/RMTrees.pdf

+0

स्पष्टता में सुधार के लिए मेरे प्रश्न को संपादित करने के लिए स्वतंत्र महसूस करें। – fredoverflow

4

यह अद्यतन के लिए "प्रभावी ढंग से निरंतर समय है।" ब्रांचिंग कारक के उस बड़े हिस्से के साथ, आपको टेराबाइट-स्केल वैक्टरों के लिए भी 5 स्तरों से आगे नहीं जाना पड़ेगा। यहां रिच के साथ एक वीडियो है और चैनल 9 पर क्लोजर के अन्य पहलुओं के बारे में बात कर रहे हैं। http://channel9.msdn.com/Shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure

8

जेम्स ब्लैक का जवाब सही है। 32 आइटम चुनने के लिए एक अन्य तर्क यह हो सकता है कि कई आधुनिक प्रोसेसर में कैश लाइन का आकार 64 बाइट्स है, इसलिए दो लाइनें 32 बिट्स के साथ 32 इंच या 32 बिट मशीन पर 32 पॉइंटर्स या 64 बिट जेवीएम को ढेर आकार के साथ 32 इंच रख सकती हैं पॉइंटर संपीड़न के कारण 32 जीबी।

+0

अनावश्यकता से बचने के लिए अब टिप्पणी हटा दी गई है। –

+0

आधुनिक कैश लाइन 64bytes है। इंटेल के सबसे नए, बहुत ही नवीनतम प्रोसेसर में केवल 128bytes हो सकते हैं। – Puppy

4

बस जेम्स के जवाब में थोड़ा सा जोड़ना।

एल्गोरिदम विश्लेषण दृष्टिकोण से, http://www.texify.com/img/%5CLARGE%5C%21O%28log%20_b%20%28N%29%29%20%3D%20O%28log%20_k%20%28N%29%29.gif क्योंकि दो कार्यों की वृद्धि लॉगरिदमिक है, इसलिए वे उसी तरह स्केल करते हैं।

लेकिन, व्यावहारिक अनुप्रयोगों में, enter image description here हॉप्स की तुलना में, कहते हैं, आधार 2 हॉप्स की एक बहुत छोटी संख्या है, पर्याप्त रूप से इतना है कि यह यह करीब लगातार समय के लिए रहता है, यहां तक ​​कि एन की काफी बड़ी मूल्यों के लिए

मुझे यकीन है कि उन्होंने कुछ मेमोरी ब्लॉक आकार की वजह से 32 को ठीक से (उच्च संख्या के विपरीत) चुना है, लेकिन मुख्य कारण छोटे आकारों की तुलना में कम संख्या में होप्स है। http://www.infoq.com/presentations/Functional-Data-Structures-in-Scala

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