यहां एक सामान्य समाधान है जो मुझे लगता है कि आपके लिए नौकरी होगी। यह प्रदर्शन के लिए अनुकूलित नहीं है, और न ही यह विशेष रूप से अच्छी तरह से परीक्षण किया गया है।
public class AgePair<T, Y>
where T : IComparable<T>
where Y : IComparable<Y>
{
public T A { get; set; }
public Y B { get; set; }
}
public class AgeRecordList<T, Y> : IEnumerable<AgePair<T,Y>>
where T : IComparable<T>
where Y : IComparable<Y>
{
private List<AgePair<T, Y>> m_List = new List<AgePair<T, Y>>();
public void Add(T a, Y b)
{
AgePair<T, Y> newPair = new AgePair<T, Y> { A = a, B = b };
// Get all elements that are younger
var younger = GetYounger(newPair.A);
// Find any of the younger with a higher score
// If found, return without inserting the element
foreach (var v in younger)
{
if (v.B.CompareTo(newPair.B) >= 0)
{
return;
}
}
// Cache elements to delete
List<AgePair<T, Y>> toDelete = new List<AgePair<T, Y>>();
// Find all the elder elements
var elder = GetElder(newPair.A);
// Find all elder elements with a lower B
foreach (var v in elder)
{
if (v.B.CompareTo(newPair.B) <= 0)
{
// Mark for delete
toDelete.Add(v);
}
}
// Delete those elements found above
foreach (var v in toDelete)
{
m_List.Remove(v);
}
// Add the new element
m_List.Add(newPair);
// Sort the list (ascending by A)
m_List.Sort(CompareA);
}
private List<AgePair<T, Y>> GetElder(T t)
{
List<AgePair<T, Y>> result = new List<AgePair<T, Y>>();
foreach (var current in m_List)
{
if (t.CompareTo(current.A) <= 0)
{
result.Add(current);
}
}
return result;
}
private List<AgePair<T, Y>> GetYounger(T t)
{
List<AgePair<T, Y>> result = new List<AgePair<T, Y>>();
foreach (var current in m_List)
{
if (t.CompareTo(current.A) > 0)
{
result.Add(current);
}
}
return result;
}
private static int CompareA(AgePair<T,Y> item1, AgePair<T,Y> item2)
{
return item1.A.CompareTo(item2.A);
}
public IEnumerator<AgePair<T, Y>> GetEnumerator()
{
return m_List.GetEnumerator();
}
}
संपादित करें 1: एल्गोरिथ्म के उच्च स्तरीय अवलोकन
- सभी युवा या बराबर तत्वों का पता लगाएं,
- सभी युवा या बराबर तत्वों के लिए, यदि किसी भी एक उच्च बी
- तो देखने (2) वापसी
- सभी बड़े तत्वों को खोजें
- यदि किसी भी बड़े तत्व के पास कम स्कोर है, तो
हटाएं
- क्रमबद्ध आरोही क्रम में सूची (ए द्वारा)
संपादित करें 2: गति आसानी से एक द्वारा बढ़ाया जा सकता) एक बार आप छोटी तत्व मिले, तो आप उस बिंदु से जारी रख सकते हैं जब बजाय बड़े तत्वों की तलाश में सभी को फिर से शुरू करना, और बी) सॉर्ट विधि सूची का उपयोग करके इसे क्रमबद्ध करने के बजाय, आप InsertAt (0 या प्रथम बुजुर्ग की अनुक्रमणिका)
पहला विचार मैं था जोड़ी के पहले तत्व और दूसरे तत्व के लिए एक समानांतर एक के लिए एक क्रमबद्ध डेटा संरचना (एक ढेर हो सकता है) रखने के लिए, एक बार आप पहली बार डेटा संरचना में एक तत्व सम्मिलित है आप संबंधित स्थिति में दूसरे तत्व को सम्मिलित करने में सक्षम होना चाहिए (एक ढेर के लिए एक ही स्थिति, एक पेड़ के लिए एक ही रास्ता) अन्यथा इसका मतलब है कि आपको तत्व को त्यागना होगा। – Teudimundo
आपको किस तरह के प्रदर्शन की आवश्यकता है? मैंने देखा है कि असम्बद्ध रूप से सम्मिलित विधि ओ (एन) होगी क्योंकि इसे संग्रह में अन्य सभी डेटा को हटाना पड़ सकता है। क्या यह ठीक है अगर डालने हमेशा रैखिक है, ओ (एन)? यदि ऐसा है, तो मैं सिर्फ एक लिंक्ड सूची का उपयोग करता हूं। यदि नहीं, तो हमें शायद किसी प्रकार की वृक्ष संरचना की आवश्यकता होगी, और हम बहुत अधिक कोड लिखेंगे! – PaulF