2010-11-20 4 views
5

खोजने के लिए मैं वर्तमान में एक होमवर्क के लिए C++ एक हैश तालिका को लागू करने की कोशिश कर रहा हूँ ...बेस्ट एसटीएल डेटा संरचना अव्यवस्थित तत्वों

मैं तालिका में टकराव के लिए एक समाधान के रूप में आंतरिक जोड़ने का उपयोग करने के लिए चुना है। ..

और मैं एक अच्छा एसटीएल कंटेनर ढूंढ रहा हूं जो डेटा के एक असाधारण सेट में एक विशिष्ट प्रविष्टि पायेगा।

मैं एक STL कंटेनर कि पेड़ पर आधारित है (सेट, नक्शे, पेड़, आदि ...)

अभी उपयोग नहीं कर सकते मैं एक सदिश का उपयोग कर रहा है, यह एक अच्छा विकल्प है? खोज का समय रैखिक होगा, है ना? क्या यह बेहतर हो सकता है?

+2

वेक्टर ठीक है, जरूरी नहीं है। निकालें-मध्य-मध्य कुशल नहीं है, इसलिए यदि आपकी बाल्टी आपको बड़ी हो सकती है इसकी तुलना 'सूची' और/या 'डेक' के साथ की जा सकती है। यदि आपकी बाल्टी को बड़ा होने की अनुमति नहीं है, तो 'वेक्टर' अधिक आवंटित हो सकता है। इन तीनों में रैखिक खोज है। obvio हमें संरचना जो रैखिक लुकअप समय को हरा सकती है वह एक और हैशटेबल (या फिर एक ही टेबल) है, जैसा कि डबल हैशिंग में है। आदेश के बिना मानक पुस्तकालयों में कुछ भी नहीं है: वे सब कुछ आदेश, और शुद्ध अनुक्रमों के साथ चीजें हैं। –

+1

'डेक' 'वेक्टर 'से बेहतर हो सकता है, क्योंकि इसे कभी भी पुन: आवंटित नहीं करना और सबकुछ ले जाना है। एक्सेस थोड़ी धीमी है, पुश_बैक संभावित रूप से बहुत तेज है, इस पर निर्भर करता है कि तत्वों की प्रतिलिपि कितनी महंगी है। 'सूची' आमतौर पर या तो अधिक स्मृति आवंटन करता है, और उस कारण से धीमा हो सकता है। –

उत्तर

2

जैसा कि आप I assume the buckets can get big... कह रहे हैं, std::list का उपयोग करना बेहतर है। खोज दोनों मामलों में रैखिक है, लेकिन तत्व जोड़ना std::list में स्थिर है।

I guess they're all the same, since data isn't ordered - नहीं, वे नहीं हैं। यदि वे थे, तो केवल एक कंटेनर होगा। प्रत्येक कंटेनर के अपने फायदे और नुकसान होते हैं, विभिन्न स्थितियों के लिए विभिन्न कंटेनरों का उपयोग किया जाता है।

वेक्टर के बारे में एक छोटी सी जानकारी:

  • std::vector, क्षमता है कि क्यों यह capacity() और size() तरीकों है है। वे दोनों अलग हैं। तो, मान लीजिए कि क्षमता 4 है और आपके पास 2 तत्व हैं, तो आकार 2 होगा। तो, एक और तत्व जोड़ना आकार बढ़ाएगा (3 होगा) और यह सब बहुत तेज़ है।

  • लेकिन क्या होता है जब आपको 5+ तत्व जोड़ना होता है और क्षमता 4 होती है? पूरी तरह से नया स्मृति आवंटित किया जाता है, सभी वर्ष तत्वों नई स्मृति में की नकल की है, सभी वर्ष तत्वों (, उनके विनाशकर्ता कहा जाता है, तो उपयोगकर्ता-निर्धारित प्रकार) नष्ट हैं। तब पुरानी मेमोरी मुक्त होनी चाहिए। ये महंगी परिचालन हैं यदि आपको लगता है कि तत्वों को जोड़ना/निकालना अक्सर अधिक होगा।
    आप कुछ स्मृति को पहले से आरक्षित करने के लिए std::vector::reserve विधि का उपयोग करके और हर समय नई मेमोरी को पुन: आवंटित नहीं करने और सब कुछ बार-बार कॉपी करने के लिए इसका उपयोग कर सकते हैं। लेकिन यह उपयोगी है जब आप इन वैक्टरों के अनुमानित आकार को जानते हैं। मुझे लगता है कि आप अपनी स्थिति में नहीं हैं (बहुत मेमोरी आरक्षित करना भी एक अच्छा समाधान नहीं है - आपको मेमोरी बर्बाद नहीं करना चाहिए जैसे कि) तो, फिर, मैं std :: सूची पसंद करूंगा।

या डबल हैश।

वैसे भी, नई स्मृति की आवंटन और वस्तुओं की प्रतिलिपि ऐसा नहीं होती है, क्योंकि std::vector "चालाक" है और जब नई जगह आवंटित होती है, तो यह क्षमता केवल 1 तत्व या कुछ के साथ क्षमता में वृद्धि नहीं करती है। मुझे लगता है कि यह इसे दोगुना करता है, लेकिन मैं इसके बारे में निश्चित नहीं हूं। Argh, मुझे नहीं पता कि यह वास्तव में अंग्रेजी में कैसे कहा जाता है .. शायद कुछ "संचित समय/स्मृति" या "संचित जटिलता" की तरह कुछ:?पता नहीं:/

नोट: जो भी आप चुनते हैं, मैं आपको हैश-फ़ंक्शन पर अपना ध्यान देने का सुझाव दूंगा। यह यहां सबसे महत्वपूर्ण है। एक हैश कंटेनर में एक ही हैश के साथ बहुत से तत्व नहीं होने चाहिए। तो, मेरी सलाह है कि एक अच्छा हैश-फ़ंक्शन खोजना और फिर इससे कोई फर्क नहीं पड़ता।

आशा है कि मदद की (:


संपादित करें: मैं आप इस लेख की सलाह देते हैं - comparing std::vector and std::deque - यह एकदम सही है - स्मृति के उपयोग (आवंटन, deallocating, बढ़ रही है), CPU उपयोग, आदि मैं था तुलना इस तरह के आलेखों के लिए पूरे site की अनुशंसा करें - बहुत सारे नहीं हैं, लेकिन वास्तव में अच्छी तरह से लिखे गए हैं।

+0

जब मैं उल्लेख कर रहा था कि वे काफी समान थे, तो मैं खोज की गति के बारे में बात कर रहा था (... क्योंकि डेटा अनियंत्रित है) – Pacane

+0

लेकिन मुझे लगता है कि मैं उस मामले के लिए एक डेक्यू या सूची का उपयोग करूँगा, सभी स्पष्टीकरणों के लिए धन्यवाद। :) – Pacane

+0

@Pacane - आपको "बहुत ज्यादा वही" के बारे में गलतफहमी के लिए खेद है। मुझे खुशी है कि मैंने मदद की (: –

0

std::tr1::unordered_set आपको जो चाहिए वह हो सकता है।

+0

हैश टेबल का उपयोग करके हैश टेबल को कार्यान्वित करना पूरी तरह से पूरे बिंदु को हरा रहा है ... –

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

  • कोई संबंधित समस्या नहीं^_^