2013-06-26 8 views
9

गो के बिल्टिन append फ़ंक्शन की जटिलता क्या है? + का उपयोग कर स्ट्रिंग concatenation के बारे में क्या?गोलांग में शामिल होने के बिग ओ

मैं उस तत्व को छोड़कर दो स्लाइसों को जोड़कर एक टुकड़ा से तत्व निकालना चाहता हूं, उदा। http://play.golang.org/p/RIR5fXq-Sf

nums := []int{0, 1, 2, 3, 4, 5, 6, 7} 
fmt.Println(append(nums[:4], nums[5:]...)) 

=> [0 1 2 3 5 6 7] 

http://golang.org/pkg/builtin/#append का कहना है कि यदि गंतव्य पर्याप्त क्षमता है, तो वह टुकड़ा resliced है। मुझे उम्मीद है कि "reslicing" एक निरंतर समय ऑपरेशन है। मैं यह भी उम्मीद कर रहा हूं कि + का उपयोग करके स्ट्रिंग कॉन्सटेनेशन पर भी लागू होता है।

+0

कुछ व्यवहार पर रेफरी: http://criticalindirection.com/2016/02/17/slice-with-a-pinch-of-salt/ – user31986

उत्तर

19

यह सब वास्तविक कार्यान्वयन पर निर्भर करता है, लेकिन मैं इसे मानक गो के साथ-साथ gccgo पर आधारित कर रहा हूं।

स्लाइस

Reslicing एक struct में एक पूर्णांक बदल रहा है (: लंबाई, स्मृति का समर्थन करने के लिए क्षमता और सूचक एक टुकड़ा तीन क्षेत्रों के साथ एक struct है) का अर्थ है।

यदि टुकड़े में पर्याप्त क्षमता नहीं है, तो संलग्न करने के लिए नई मेमोरी आवंटित करने और पुराने को कॉपी करने की आवश्यकता होगी। < 1024 तत्वों के साथ स्लाइस के लिए, यह स्लाइस के लिए क्षमता को दोगुना कर देगा, 1024 तत्वों के साथ यह कारक 1.25 द्वारा इसे बढ़ाएगा।

स्ट्रिंग्स

के बाद से तार अपरिवर्तनीय हैं, + के साथ प्रत्येक स्ट्रिंग संयोजन एक नया स्ट्रिंग है, जो पुराने एक कॉपी करने का मतलब है पैदा करेगा। तो यदि आप इसे एक लूप में एन बार कर रहे हैं, तो आप एन स्ट्रिंग आवंटित करेंगे और एन बार के आसपास स्मृति कॉपी करेंगे।

+0

धन्यवाद! 'स्ट्रिंग' फ़ंक्शन में uint8 का टुकड़ा गुजरने के बारे में क्या? क्या वह 'ओ (1) 'या' ओ (एन) 'है? (मानक गो कार्यान्वयन) – Kaleidoscope

+2

ओ (एन)। स्लाइस म्यूटेबल हैं, तार नहीं हैं → इसे डेटा कॉपी करना है। –

+6

दूसरे शब्दों में, एक टुकड़ा के लिए तत्व जोड़ना ओ (1) amortized है। – newacct

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