2010-10-04 8 views
14

जब एक हैश के रूप में इस्तेमाल जावास्क्रिप्ट का उपयोग करने के लिए सरणी बड़ा हे क्या है?हैश के रूप में उपयोग किए जाने पर जावास्क्रिप्ट की सरणी के लिए बड़ा ओ क्या है?

उदाहरण के लिए

,

var x= []; 
for(var i=0; i<100000; i++){ 
    x[i.toString()+'a'] = 123; // using string to illustrate x[alpha] 
} 
alert(x['9999a']); // linear search? 

एक आशा कर सकते हैं जे एस इंजन एक रेखीय खोज आंतरिक हे (एन) का उपयोग नहीं होगा, लेकिन यकीन है कि के लिए है?

+4

कुछ नहीं "पक्का" है (जब तक, सी ++ के साथ के रूप में, मानक को परिभाषित करता है कंटेनरों? के प्रदर्शन विशेषताओं) लेकिन मैं गारंटी ले सकते हैं कि कोई ब्राउज़र एक रेखीय खोज का उपयोग करता है । इन दिनों जेएस बेंचमार्क में ब्राउज़र को एक-दूसरे से बाहर करने के लिए भारी प्रतिस्पर्धा है; आप आश्वस्त रह सकते हैं कि एक सरणी अनुक्रमणित करना जितना तेज़ होगा उतना ही ब्राउज़र निर्माता इसे बना सकता है। – meagar

उत्तर

7

पहला और सबसे महत्वपूर्ण Arrays वास्तव में हैंश हैं। हमेशा

var x = []; 
x[5] = 10; 
alert(x[5] === x["5"]); // true 

वस्तुओं हैश कर रहे हैं और सरणी सिर्फ विशेष वस्तुओं हैं: यही कारण है कि x[5] === x["5"] है। यदि आप ऑब्जेक्ट्स के लिए सामान्य हैश का उपयोग करना चाहते हैं। जावास्क्रिप्ट में "एसोसिएटिव सरणी" ऑब्जेक्ट्स हैं। Arrays संख्यात्मक रूप से अनुक्रमित डेटा के लिए हैं। Arrays एक length संपत्ति और push, pop, sort, आदि जो हैश पर इस्तेमाल किया जा करने के लिए कोई मतलब नहीं है की तरह सरणी की तरह तरीकों की है।

ऑब्जेक्ट्स में खोज के लिए बड़े ओ के लिए: यह कार्यान्वयन निर्भर है।

शायद 2 सबसे अच्छी चीजों में आप के लिए कर सकते हैं:

  1. चेक कुछ ब्राउज़र कार्यान्वयन

  2. के स्रोत कोड बड़ा n के लिए कुछ बेंचमार्क करो और अपने निष्कर्ष


के संबंधित भाग:

4.3.3 वस्तु

एक वस्तु गुण का एक संग्रह है और एक भी प्रोटोटाइप वस्तु है।

8.6.2 वस्तु आंतरिक गुण और तरीके

सरणी वस्तुओं एक से थोड़ा [[DefineOwnProperty]] आंतरिक विधि के विभिन्न कार्यान्वयन है। सरणी वस्तुओं संपत्ति के नाम की एक निश्चित वर्ग के लिए विशेष उपचार दे।

+1

Arrays हैंश नहीं हैं। 'X [" 5 "]' में मान को लुकअप से पहले 'संख्या' में डाला गया है। यही कारण है कि आप 'x [5] 'के लिए भी वही परिणाम प्राप्त करते हैं। हालांकि, 'ऐरे' में इसकी प्रोटोटाइप श्रृंखला में 'ऑब्जेक्ट' है, इस प्रकार यह जावास्क्रिप्ट में एक प्रकार नहीं है और 'typeof === "ऑब्जेक्ट" '। यह '~~" 5 "' के समान होता है और यदि यह 0 के बराबर होता है, तो सरणी को 'x ["a5"]' कहने के मामले में छूटा नहीं जाता है। – Tower

+0

मैंने एक के लिए मेरे संदर्भ (उस मामले के लिए ** भाषा विनिर्देश **) दिया है, आप अपने पूरी तरह से व्यक्तिपरक और ** झूठी सिद्धांतों के लिए आधार के रूप में क्या दिखा सकते हैं **? यह वह जगह है जहां समस्या शुरू करने के लिए प्रयोग किया जाता है। – galambalazs

+1

(http://es5.github.com/#x15.4) '1.) 'Arrays हैंश, *" 15.4 ** ऐरे ऑब्जेक्ट्स **: ऐरे ऑब्जेक्ट्स ** संपत्ति नामों की एक निश्चित कक्षा को विशेष उपचार देते हैं **। "*' 2.) 'संपत्ति के नाम (यहां तक ​​कि सरणी इंडेक्स) को तारों के रूप में माना जाता है: * "एक संपत्ति का नाम पी (** स्ट्रिंग मान ** के रूप में) एक ** सरणी अनुक्रमणिका ** है और केवल तभी करना है जब ToString (ToUint32 (P)) पी और ToUint32 (पी) के बराबर है 232-1 के बराबर नहीं है। "*' 3.) 'यह '~~' जैसी कुछ नहीं है क्योंकि यह एक डबल बिटवाई ऑपरेटर है जो आप किसी प्रकार के बाइट-शेविंग ऑप्टिमाइज़ेशन आलेख से उठाया गया है, और विनिर्देश के पास कहीं भी नहीं है। – galambalazs

14

जावास्क्रिप्ट में ऑब्जेक्ट गुणों और सरणी तत्वों तक पहुंचने के लिए वाक्य रचनात्मक रूप से constant time: O (1) में किया जाना माना जाता है। ईसीएमएस्क्रिप्ट विनिर्देश में प्रदर्शन विशेषताओं की गारंटी नहीं है, लेकिन सभी आधुनिक जावास्क्रिप्ट इंजन निरंतर समय में ऑब्जेक्ट गुणों को पुनर्प्राप्त करते हैं।- 2.93GHz इंटेल कोर 2 डुओ

Firebug, फ़ायरफ़ॉक्स 3.6.10 (मैक ओएस एक्स 10.6.4 में
var largeObject = {}; 
var smallObject = {}; 

var x, i; 

for (i = 0; i < 1000000; i++) { 
    largeObject['a' + i] = i; 
} 

for (i = 0; i < 1000; i++) { 
    smallObject['b' + i] = i; 
} 

console.time('10k Accesses from largeObject'); 
for (i = 0; i < 10000; i++) x = largeObject['a' + (i % 1000000)]; 
console.timeEnd('10k Accesses from largeObject'); 

console.time('10k Accesses from smallObject'); 
for (i = 0; i < 10000; i++) x = largeObject['a' + (i % 1000)]; 
console.timeEnd('10k Accesses from smallObject'); 

परिणाम:

यहाँ एक सरल तरीका दिखाते हुए अभिगम समय बढ़ने जब कंटेनर x1000 गुना बड़ी है उदाहरण दिया गया है): क्रोम देव उपकरण में

10k Accesses from largeObject: 22ms 
10k Accesses from smallObject: 19ms 

परिणाम 6.0.472:

10k Accesses from largeObject: 15ms 
10k Accesses from smallObject: 15ms 

इंटरनेट Expl विंडोज पर Firebug Lite के साथ 8.0.7600 orer 7

10k Accesses from largeObject: 250ms 
10k Accesses from smallObject: 219ms 
+2

क्या आप ईसीएमएस्क्रिप्ट या जावास्क्रिप्ट विनिर्देशों में अनुच्छेद को इंगित कर सकते हैं जो कहता है कि सरणी तत्वों या ऑब्जेक्ट गुणों तक पहुंचने के लिए ओ (1) होने की गारंटी है? AFAIK, जेस्क्रिप्ट में ऑब्जेक्ट्स के सरल कार्यान्वयन सूचियों के रूप में एक पूर्ण मानकों-अनुरूप ओ (एन) कार्यान्वयन है। –

+1

@ जोर्ग: यह spec में उल्लेख नहीं है, इसलिए व्यवहार में यह कार्यान्वयन निर्भर है ... इसलिए मैंने यह कहना चुना कि यह "वाक्य रचनात्मक रूप से माना जाता है"। फिर भी, मैंने अपने उत्तर को अधिक सटीक होने के लिए दोहराया। –

+4

मुझे नहीं पता कि आईई टीम इस तरह के शर्मनाक परिणामों के साथ कैसे रह सकती है ... – ChaosPandion

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

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