以下是我認爲能爲您完成這項工作的通用解決方案。它沒有針對性能進行優化,也沒有特別好的測試。
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:算法的高級概述
- 找到所有年輕或等於元素,
- 對於所有年輕的或相同的元件,看是否有一個以上B
- 如果(2)返回
- 查找所有老年人元素
- 如果任何老年人元素得分較低,請刪除
- 排序列表按升序(按A)
編輯2:速度可以很容易地通過增加),一旦你找到了年輕的元素,你可以從該點尋找老人元素,而不是在繼續b)不用使用List的排序方法對它排序,而是使用InsertAt(0或第一個長輩的索引)
我的第一個想法是保持排序的數據結構(可能是堆)爲夫婦的第一個元素和一個並聯一個第二元素,一旦你在第一數據結構中插入一個元素你應該能夠將第二個元素插入相應的位置(堆的位置相同,樹的路徑相同),否則就意味着必須丟棄該元素。 – Teudimundo
你需要什麼樣的表現?我注意到漸近地插入方法將是O(n),因爲它可能需要刪除集合中的所有其他數據。如果插入總是線性的,O(n)是可以的嗎?如果是這樣,我只是使用鏈表。如果不是,我們可能需要某種樹結構,我們會寫更多的代碼! – PaulF