2011-09-05 13 views
11

रूबी सरणी आंतरिक रूप से कार्यान्वित कैसे होते हैं (मुख्य रूप से क्रुबी में, लेकिन किसी अन्य जानकारी का स्वागत है)?रूबी सरणी आंतरिक

क्या वे सी ++ वेक्टर की तरह बढ़ते सरणी हैं या वे सूची आधारित हैं? शिफ्ट/unshift की जटिलता और सूचकांक द्वारा एक तत्व का उपयोग क्या है?

+3

बस एसवीएन डेपो चेकआउट करें और स्रोत कोड पढ़ें। कार्यान्वयन सी प्रोग्रामर के लिए वास्तव में कठिन नहीं है। – texasbruce

उत्तर

15

वे उगने वाले सरणी हैं जो "अंत में बढ़ते हैं"।

shiftO(1) है, unshiftO(n) है और सूचकांक द्वारा तक पहुँचने O(1) है। मेरे सबसे अच्छे ज्ञान के लिए यह सभी रूबी कार्यान्वयन के लिए सच है, लेकिन यह निश्चित रूप से एमआरआई में करता है।

+2

मुझे यकीन नहीं है कि शिफ्ट हमेशा ओ (एन) है। अगर मुझे सही याद आती है, तो स्मृति ब्लॉक की शुरुआत और पहले आइटम की अनुक्रमणिका को अलग से ट्रैक किया जाता है, ताकि आप पहले इटैम इंडेक्स को बढ़ाकर ओ (1) शिफ्ट कर सकें। Unshift केवल ओ (एन) है अगर आप किसी भी बदलाव किया है। – AShelly

+0

@AShelly: आपको 'शिफ्ट' के बारे में सही लगता है (हालांकि यह वास्तव में प्रारंभिक अनुक्रमणिका का ट्रैक नहीं रखता है, बल्कि इसके बजाय सरणी साझा करता है), लेकिन 'unshift' निश्चित रूप से' ओ (एन) 'है - यह' सरणी पर memmove' कोई फर्क नहीं पड़ता कि क्या। – sepp2k

+0

किसी को देखने के लिए कुछ बेंचमार्क करना चाहिए। –

2

unshift मेरी ruby1.9 में ओ (एन^2) है।

$ /usr/bin/time ruby -e 'n=100000;l=[];(1..n).each{|i| l.push(i);}' 
     0.03 real   0.02 user   0.00 sys 
$ /usr/bin/time ruby -e 'n=100000;l=[];(1..n).each{|i| l.unshift(i);}' 
     3.15 real   3.11 user   0.01 sys 
$ /usr/bin/time ruby -e 'n=200000;l=[];(1..n).each{|i| l.unshift(i);}' 
     12.96 real  12.85 user   0.03 sys 
$ ruby -v 
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.3.0] 
+0

अगर मैं गलत हूं तो मुझे सही करें लेकिन क्या यह नहीं दिखाता कि अनशिफ्ट में समयबद्ध जटिलता है? यदि unshift रैखिक था, क्योंकि आप 100,000 से 200,000 तक एन बढ़ाते हैं, तो आप उम्मीद नहीं करेंगे कि समय दोगुना हो जाएगा। चूंकि एन 2 के कारक से बढ़ता है, एल्गोरिदम को पूरा करने के लिए लिया गया समय 4 के कारक से बढ़ाया जाता है। संचालन की संख्या डेटा-सेट वर्ग के आकार के समान होती है। – louism2

+1

@ louism2 सही ... मैंने ओ (एन^2) को तय किया, और देखा कि रूबी 2 में ओश (एन) रूबी 2 में ओ (एन) है, और ओ (एन^2) रूबी 1.9 में है। –

+0

यदि अनशिफ्ट ओ (एन) है और आप इसे बार कहते हैं तो यह ओ (एन^2) समय लेगा .. मुझे लगता है कि आप एक प्रवृत्ति के लिए दो से अधिक डेटा पॉइंट चाहते हैं .. – olleicua

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