ओ (एन) से बेहतर होने के लिए आपको 2 शब्दकोश का उपयोग करने की आवश्यकता होगी। हालांकि जैसा कि आपने बताया है कि आप structs का उपयोग कर रहे हैं और एक दूसरी शब्दकोश के साथ मेमोरी उपयोग के बारे में चिंतित हैं जिसमें संरचना की डुप्लिकेट प्रति है।
इसके आस-पास एक तरीका ऑब्जेक्ट के अंदर संरचना मूल्य बॉक्स है, फिर बॉक्सिंग ऑब्जेक्ट को दो शब्दकोशों में साझा करें। यदि आप DictionaryBase
से उत्तराधिकारी का उपयोग करते हैं तो यह वास्तव में लागू करने में काफी आसान है।
public sealed class TwoWayDictionary<TKey, TValue> : DictionaryBase
{
Hashtable reverseLookup = new Hashtable();
public void Add(TKey key, TValue value)
{
this.Dictionary.Add(key, value);
}
public void Remove(TKey key)
{
this.Dictionary.Remove(key);
}
public bool TryGetValue(TKey key, out TValue value)
{
object lookup = Dictionary[key];
if (lookup == null)
{
value = default(TValue);
return false;
}
else
{
value = (TValue)lookup;
return true;
}
}
public bool TryGetKey(TValue value, out TKey key)
{
object lookup = reverseLookup[value];
if (lookup == null)
{
key = default(TKey);
return false;
}
else
{
key = (TKey)lookup;
return true;
}
}
//If OnInsertComplete or OnSetComplete raises a exception DictionaryBase will
// roll back the operation it completed.
protected override void OnInsertComplete(object key, object value)
{
reverseLookup.Add(value, key);
}
protected override void OnSetComplete(object key, object oldValue, object newValue)
{
if(reverseLookup.Contains(newValue))
throw new InvalidOperationException("Duplicate value");
if(oldValue != null)
reverseLookup.Remove(oldValue);
reverseLookup[newValue] = key;
}
protected override void OnRemoveComplete(object key, object value)
{
reverseLookup.Remove(value);
}
}
Dictionary
और reverseLookup
शब्दकोशों ही संदर्भ का हिस्सा तो यह दृढ़ता से टाइप किया दो शब्दकोशों का उपयोग कर बड़े structs के साथ तुलना में एक छोटे स्मृति पदचिह्न होगा।
एक पूर्ण Dictionary<TKey, TValue>
कार्यान्वयन लिखने के बिना जो कुंजी और मूल्यों के लिए दो आंतरिक बाल्टी संग्रह और बाल्टी के चेन के लिए दो लिंक्ड सूचियों का उपयोग करता है, मुझे नहीं लगता कि आपको बेहतर परिणाम मिल सकते हैं।
स्रोत
2015-12-11 18:17:20
"स्मृति को डुप्लिकेट किए बिना (इसलिए दो शब्दकोष प्रश्न से बाहर हैं)।" दो शब्दकोशों का उपयोग करके स्मृति को डुप्लिकेट नहीं किया जाता है जब तक कि आपका 'टीकेई' और 'टीवील्यू' दोनों स्ट्रक्चर नहीं होते हैं। –
@ScottChamberlain वे दोनों structs हैं :) –
मुझे नहीं पता कि आप क्या पूछना संभव है। मेरा मतलब है, मुझे बहुत कुछ पता नहीं है और अभी भी सीखने के लिए बहुत कुछ है लेकिन कंप्यूटर विज्ञान के बारे में मैंने हमेशा एक बात सुनी है: "आप इसे तेजी से चाहते हैं? आपको स्मृति चाहिए। आप इसे हल्का चाहते हैं? यह धीमा हो जाएगा।" लेकिन जब मैं घुसपैठ कर रहा हूं, तो मैं आपके प्रश्न का पक्ष लेता हूं। –