2009-03-13 16 views
5

मुझे अपनी कक्षाओं में से एक में एक उदाहरण सदस्य के रूप में एक लुकअप टेबल स्टोर करने की आवश्यकता है। ऑब्जेक्ट का निर्माण होने पर तालिका प्रारंभ की जाएगी।इस मेमोरी लुकअप टेबल के लिए सबसे अच्छी डेटा संरचना क्या है?

StringKey (e.g., "car") 
EnumKey (e.g., LookupKeys.Car) 
Value (e.g, "Ths is a car.") 

मैं डेटा संरचना है कि या तो StringKey या EnumKey द्वारा लुकअप करने के लिए सबसे अच्छा प्रदर्शन निकलेगा लेने के लिए चाहते हैं: प्रत्येक "पंक्ति" 3 "कॉलम" होगा।

यह एक ही शब्दकोश के लिए 2 चाबियाँ अजीब है। मैंने पहले कभी इसका सामना नहीं किया है, इसलिए मैं सोच रहा हूं कि इस तरह की चीज़ के लिए मानक क्या है।

मैं कुंजी/कुंजी/वैल्यू के बजाय एक कुंजी/वैल्यू/वैल्यू स्ट्रक्चर बना सकता हूं, लेकिन मुझे आश्चर्य है कि किस प्रकार का प्रदर्शन प्रभाव होगा।

क्या मैं इस सब गलत के बारे में सोच रहा हूं?

उत्तर

4

आपके पास दो हैशपैप्स हैं।

  • स्ट्रिंगकी से मूल्य के लिए एक।

  • EnumKey से मूल्य के लिए एक।

आप सभी मूल्य उदाहरणों नकल करने की जरूरत नहीं है, उन वस्तुओं दो HashMaps के बीच साझा किया जा सकता है।

यदि यह बहुत सी चीजें हैं, तो आप दो हैशैप्स के बजाय दो ट्रेमैप्स का उपयोग करना चाह सकते हैं। लेकिन आवश्यक सिद्धांत ("मूल्य साझा करें") दोनों संरचनाओं पर लागू होता है। दो नक्शे के साथ मूल्यों का एक सेट।

+0

ठीक है - तो मेरे उदाहरण में, "मूल्य उदाहरण" केवल तार हैं। मैं 2 शब्दकोश (एक स्ट्रिंगकी के साथ, एक EnumKey के साथ) कर दूंगा जिसके मूल्यों में एक ही स्ट्रिंग संदर्भ चर शामिल है। क्या यह सही लगता है? –

+0

निश्चित रूप से। पायथन में यह सब कुछ है। जावा में, एक string.intern() है जो आश्वस्त करता है कि सभी इंटर्न() 'डी स्ट्रिंग्स को एक सामान्य स्ट्रिंग पूल में कम कर दिया जाता है, जिससे कुछ संभावित अनावश्यकता समाप्त हो जाती है। –

+0

मैं सी # का उपयोग कर रहा हूं ... क्या आपको पता है कि .NET स्ट्रिंग की एक प्रति बना देगा जब मैं इसे प्रत्येक शब्दकोश में जोड़ूं? –

5

अच्छा ... "गलत" इसे डालने का एक कठोर तरीका है। मुझे लगता है कि सबसे आम शब्दकोश "मूल्य के लिए एकल कुंजी" है, और उस प्रयास (मानचित्र) के लिए कुशल डेटा संरचनाओं को प्रदान करने में बहुत सारे प्रयास होते हैं, अक्सर उन दोनों का उपयोग करना सर्वोत्तम होता है, यदि मूल्यों के लिए स्मृति साझा करना बिल्कुल भी संभव है।

1

क्या यह वास्तव में दोनों प्रकार की कुंजी के साथ एक ही संरचना में कुंजी करना आवश्यक है? आपको शायद एक जटिल डेटा संरचना को पुनर्निर्माण करने की आवश्यकता नहीं है। आप लुकअप टेबल के लिए कुछ प्रकार के encapsulation कर सकते हैं ताकि स्मृति में कोई समस्या नहीं है, तो आपके पास वास्तव में दो लुकअप टेबल हैं। आप इस encapsulating संरचना का उपयोग किसी भी प्रकार की कुंजी के साथ "समान" संरचना से मूल्य खींचने में सक्षम होने के अनुकरण के लिए कर सकते हैं।

या

अगर वहाँ किसी तरह enum मूल्य और स्ट्रिंग कुंजी आप केवल लुकअप तालिका का एक प्रकार होने के साथ उस मार्ग जा सकते हैं के बीच मैप करने के लिए है।

0

LINQ के ILookup (TKey, Telement) इंटरफ़ेस सहायता कर सकता है।

Dictionary<carKey, carValue> cars; 

आप इस्तेमाल कर सकते हैं: अपने शब्दकोश मानते हुए की तरह कुछ है

ILookUp<carValue, carKey> lookup = cars.ToLookup(x => x.Value, x => x.Key); 

(... वास्तव में मुझे लगता है कि मैं थोड़ा हो सकता है सवाल पढ़ने में भूलना - लेकिन एक ILookUp अभी भी बिल को फिट सकता है, लेकिन कुंजी/मूल्य सेट को कुंजी और enum होने की आवश्यकता हो सकती है।)

0

यदि प्रत्येक मूल्य दोनों प्रकार की चाबियों से सुलभ होने की गारंटी है, तो दूसरा विचार एक प्रकार की कुंजी को दूसरे में परिवर्तित करना होगा। उदाहरण के लिए:

public Value getValue(String key) 
{ 
    dictionary.get(key); // normal way 
} 

public Value getValue(Enum enumKey) 
{ 
    String realKey = toKey(enumKey); 
    getValue(realKey); // use String key 
} 

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

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