मैंने वास्तव में 2 महीने पहले विषय पर एक ब्लॉग पोस्ट लिखा था। लेख सी # के लिए है, List<T>
लेकिन जावा का ArrayList
एक समान कार्यान्वयन है। चूंकि ArrayList
एक गतिशील सरणी का उपयोग करके कार्यान्वित किया जाता है, इसलिए यह मांग पर आकार में बढ़ जाता है। तो क्षमता निर्माण का कारण अनुकूलन उद्देश्यों के लिए है।
जब इन रेज़िस्टेंस ऑपरेशन में से एक होता है, तो ArrayList सरणी की सामग्री को नए सरणी में कॉपी करता है जो पुराने की क्षमता से दोगुना है। यह ऑपरेशन ओ (एन) समय में चलता है ।
उदाहरण
यहाँ एक उदाहरण दिया गया है कि ArrayList
आकार में वृद्धि कैसे होगी:
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
इसलिए सूची की क्षमता के साथ शुरू होता है 10
, जब 11 वीं वस्तु को जोड़ा जाता है, तो इसे बढ़ा दिया 50% + 1
जाता है 16
। 17 वें आइटम पर ArrayList
फिर से 25
और इसी तरह बढ़ा दिया जाता है । अब उस उदाहरण पर विचार करें जहाँ हम एक सूची बना रहे हैं जहाँ वांछित क्षमता पहले से ही ज्ञात है 1000000
। बनाना ArrayList
आकार निर्माता के बिना कॉल करेंगे ArrayList.add
1000000
बार जो लेता हे (1) सामान्य रूप से या हे (एन) आकार बदलने पर।
1000000 + 16 + 25 + ... + 670205 + 1005308 = 4015851 संचालन
कंस्ट्रक्टर का उपयोग करके इसकी तुलना करें और फिर कॉलिंग करें ArrayList.add
जो ओ (1) में चलने की गारंटी है ।
1000000 + 1000000 = 2000000 ऑपरेशन
जावा बनाम सी #
जावा ऊपर है, शुरू करने 10
और प्रत्येक आकार बढ़ाने पर 50% + 1
। C # पर शुरू होता है 4
और प्रत्येक आवर्तन पर दोगुना अधिक आक्रामक रूप से बढ़ता है। 1000000
सी # उपयोगों के लिए ऊपर से एक उदाहरण कहते हैं 3097084
आपरेशनों।
संदर्भ