जावास्क्रिप्ट ES6 कम्प्यूटेशनल / संग्रह की समय जटिलता


84

किस समय जटिलता (बिग-ओ नोटेशन में) कुंजी संग्रह के लिए ईएस 6 विनिर्देश (सेट, मानचित्र, कमजोर और कमजोर) के लिए प्रदान की जाती है?

मेरी अपेक्षा, और मैं अधिकांश डेवलपर्स से अपेक्षा करता हूं, यह है कि विनिर्देशों और कार्यान्वयन व्यापक रूप से स्वीकार किए गए प्रदर्शन एल्गोरिदम का उपयोग करेंगे , जिस स्थिति में Set.prototype.has, addऔर deleteसभी के लिए औसत मामले में ओ (1) होगा। Mapऔर Weak–समकक्षों के लिए समान।

यह पूरी तरह से मेरे लिए स्पष्ट नहीं है कि क्या कार्यान्वयन की समय जटिलता को अनिवार्य किया गया था उदाहरण के लिए ECMAScript 2015 भाषा विनिर्देश - 6 वें संस्करण - 23.2 सेट ऑब्जेक्ट्स

जब तक मैं इसे गलत नहीं समझता (और यह निश्चित रूप से बहुत संभव है कि मैं करता हूं), यह ईसीएमए कल्पना को दर्शाता है कि कार्यान्वयन (जैसे Set.prototype.has) एक रैखिक समय ( ओ (एन) ) एल्गोरिदम का उपयोग करने के लिए हैं । यह मुझे अत्यधिक आश्चर्यचकित करेगा कि अधिक प्रदर्शन करने वाले एल्गोरिदम को युक्ति द्वारा अनिवार्य या अनुमति नहीं दी जाएगी, और मुझे इस बात के लिए स्पष्टीकरण में बहुत दिलचस्पी होगी कि यह मामला क्यों है।


2
सभी ओ (1) एल्गोरिदम ओ (एन) के रूप में अच्छी तरह से कर रहे हैं, इसलिए कम से कम प्रदर्शनकारी कार्यान्वयन में जाने से कोई नुकसान नहीं होता है। संभवत: कम प्रदर्शन करने वाले कार्यान्वयन विवश संसाधनों वाले सिस्टम में कुछ रुचि के हो सकते हैं, क्योंकि सबसे अधिक संभावना है कि उन्हें बहुत कम कोड / स्थान की आवश्यकता होती है।
आर्टुर ग्रेज़िएक

@arturgrzesiak कुंजी संग्रह का हे (1) प्रदर्शन आम तौर पर एक हे (1) हैश प्लस ओ (एन) टक्कर बाल्टी के साथ हासिल किया जाता है। O (n) सबसे खराब स्थिति सबसे व्यावहारिक उद्देश्यों के लिए है जो कि खगोलीय रूप से दुर्लभ है। इन तकनीकों की अंतरिक्ष जटिलता आमतौर पर O (n) है।
ब्रायन एम। हंट

1
"सेट ऑब्जेक्ट्स को या तो हैश टेबल या अन्य तंत्रों का उपयोग करके लागू किया जाना चाहिए जो औसतन, संग्रह में तत्वों की संख्या के आधार पर एक्सेस टाइम प्रदान करते हैं।" - उसी पृष्ठ से।
जॉर्ज २

जवाबों:


59

ठीक उसी से जो आपके पैराग्राफ से जुड़ा हुआ है:

सेट ऑब्जेक्ट्स को [तंत्र] का उपयोग करके लागू किया जाना चाहिए, जो औसतन, संग्रह में तत्वों की संख्या के आधार पर एक्सेस टाइम प्रदान करते हैं।

आपको मैप्स , WeakMaps और WeakSets के समान वाक्य मिलेंगे

यह ECMA कल्पना को दर्शाता है कि कार्यान्वयन (जैसे Set.prototyp.has) एक रैखिक समय ( O(n)) एल्गोरिथ्म का उपयोग करने के लिए हैं ।

नहीं:

इस Setऑब्जेक्ट विनिर्देश में उपयोग की जाने वाली डेटा संरचनाएं केवल सेट ऑब्जेक्ट्स के आवश्यक अवलोकन शब्दार्थों का वर्णन करना है। यह एक व्यवहार्य कार्यान्वयन मॉडल होने का इरादा नहीं है।

अवलोकनीय शब्दार्थ अधिकतर पूर्वानुमानित क्रम के क्रम से संबंधित होते हैं (जो अभी भी कुशल और तेज लागू किए जा सकते हैं )। यह वास्तव में विनिर्देश द्वारा उम्मीद की जाती है कि एक कार्यान्वयन हैश तालिका या निरंतर उपयोग के साथ कुछ समान है, हालांकि पेड़ों (लॉगरिदमिक एक्सेस जटिलता के साथ) की अनुमति है।


2
इसे बाहर निकालने के लिए धन्यवाद। जब तक मैं उस पैराग्राफ में पहुँचता हूँ, तब तक मेरी आँखें चमक उठी होंगी। :) तो एल्गोरिदम जो ओ (लॉग (एन)) या ओ (1) हैं, लेकिन अन्यथा अनिवार्य नहीं हैं (बशर्ते वे ओ (एन) के तहत हों)
ब्रायन एम। हंट

1
@ ब्रायन।मंट: सही।
बरगी

31

जिज्ञासु किसी के लिए, मैंने एक बहुत ही त्वरित बेंचमार्क किया:

const benchmarkMap = size => {
  console.time('benchmarkMap');
  var map = new Map();
  for (var i = 0; i < size; i++) map.set(i, i);
  for (var i = 0; i < size; i++) var x = map.get(i);
  console.timeEnd('benchmarkMap');
}

const benchmarkObj = size => {
  console.time('benchmarkObj');
  var obj = {};
  for (var i = 0; i < size; i++) obj[i] = i;
  for (var i = 0; i < size; i++) var x = obj[i];
  console.timeEnd('benchmarkObj');
}

var size = 1000000;

benchmarkMap(size);
benchmarkObj(size);

मैंने इसे कुछ बार चलाया और निम्नलिखित परिणाम प्राप्त किए:

(2017 मैकबुक प्रो, 2.5 GHz i7 w / 16G RAM)

benchmarkMap: 189.120ms
benchmarkObj: 44.214ms

benchmarkMap: 200.817ms
benchmarkObj: 38.963ms

benchmarkMap: 187.968ms
benchmarkObj: 41.633ms

benchmarkMap: 186.533ms
benchmarkObj: 35.850ms

benchmarkMap: 187.339ms
benchmarkObj: 44.515ms

3
@domdambrogia यदि आप मुझे मिलने से सेटिंग अलग करते हैं: मैप सेट = 124, मैप गेट = 40, ऑब्जेक्ट सेट = 26, ऑब्जेक्ट गेट = 1 (ये अनुपात नहीं हैं एमएस)
AJP

@AJP मैंने इसके बारे में नहीं सोचा था, इसे उन आंकड़ों के साथ तोड़ दिया। आपके इनपुट के लिए धन्यवाद, यह एक अच्छा योगदान है। मैं देखूंगा कि क्या मैं अपने उत्तर में जोड़ सकता हूं जब मेरे पास दूसरा होगा। धन्यवाद!
डोमडम्ब्रोगिया

यह जानना दिलचस्प होगा कि असाइनमेंट को रीडिंग से अलग करना भी सीखें कि दोनों में से कौन सा रीडिंग के लिए तेज़ है।
फर्नान्डोपासिक 19

3
" 2017 मैकबुक प्रो, 2.5 GHz i7 w / 16G RAM " - उह, यह अच्छा है और सभी, लेकिन कौन सा जावास्क्रिप्ट इंजन आपने बेंचमार्क किया?
बर्गी

1
दिलचस्प रूप से पर्याप्त है, जब deleteसंचालन और संचालन को जोड़ते हैं, तो Mapबहुत बेहतर प्रदर्शन करता है। jsfiddle.net/23hrp0eq
जोर्जॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.