比较两个列表并找到这两个列表之间的增量的最有效模式/算法是什么?

问题描述 投票:0回答:3

我们有两个学生名单及其分数:

  • existingList
    学生成绩
  • newList
    学生成绩

我想比较这两个列表

  • 找到新列表和旧列表之间的增量,
  • 然后找到侵入性最小的方式将任何更改插入或更新到新列表中。

解决这个问题的最佳算法是什么? 希望专注于对新列表和性能进行最小程度的更改。

示例代码:

List<ListItem> existingList = new List<ListItem>();
List<ListItem> newList = new List<ListItem>();
    
public TopLists()
{
  InitTwoLists();
}
    
private void InitTwoLists()
{
  existingList.Add(new ListItem { Name = "Shane", Score = 100 });
  existingList.Add(new ListItem { Name = "Mark", Score = 95 });
  existingList.Add(new ListItem { Name = "Shane", Score = 94 });
  existingList.Add(new ListItem { Name = "Steve", Score = 90 });
  existingList.Add(new ListItem { Name = "Brian", Score = 85 });
  existingList.Add(new ListItem { Name = "Craig", Score = 85 });
  existingList.Add(new ListItem { Name = "John", Score = 82 });
  existingList.Add(new ListItem { Name = "Steve", Score = 81 });
  existingList.Add(new ListItem { Name = "Philip", Score = 79 });
  existingList.Add(new ListItem { Name = "Peter", Score = 70 });
  
  newList.Add(new ListItem { Name = "Shane", Score = 100 });
  // This is change
  newList.Add(new ListItem { Name = "Steve", Score = 96 });  
  newList.Add(new ListItem { Name = "Mark", Score = 95 });
  newList.Add(new ListItem { Name = "Shane", Score = 94 });
  newList.Add(new ListItem { Name = "Brian", Score = 85 });
  newList.Add(new ListItem { Name = "Craig", Score = 85 });
  newList.Add(new ListItem { Name = "John", Score = 82 });
  newList.Add(new ListItem { Name = "Steve", Score = 81 });
  newList.Add(new ListItem { Name = "Philip", Score = 79 });
  newList.Add(new ListItem { Name = "Peter", Score = 70 });
}
}

如何实施

CompareLists()

public void CompareLists()
{
  // How would I find the deltas and update the 
  // new list with any changes from old?
}
}

public class ListItem
{
  public string Name { get; set; }
  public int Score { get; set; }
}

** 编辑:所需的输出***

所需的输出是实际更改带有增量的 newList。 例如在这种情况下:

newList.Add(new ListItem { Name = "Shane", Score = 100 });
  newList.Add(new ListItem { Name = "Steve", Score = 96 });  // This is change
  newList.Add(new ListItem { Name = "Mark", Score = 95 });
  newList.Add(new ListItem { Name = "Shane", Score = 94 });
  newList.Add(new ListItem { Name = "Brian", Score = 85 });
  newList.Add(new ListItem { Name = "Craig", Score = 85 });
  newList.Add(new ListItem { Name = "John", Score = 82 });
  newList.Add(new ListItem { Name = "Steve", Score = 81 });
  newList.Add(new ListItem { Name = "Roger", Score = 80 });  // Roger is a new entry
  newList.Add(new ListItem { Name = "Phillip", Score = 79 });  // Philip moved down one

// Peter 以 70 分从这个列表中删除,因为我只想要前 10 名。

所以变化是:

更新“Steve”的记录2,分数已改变 在位置 9 插入新记录“Roger” 打破了“Peter”跌出前 10 名的记录。

c# algorithm computer-science
3个回答
6
投票

如果您正在寻找一种通用的、与语言无关的解决方案,那么您正在寻找某种有序列表的“数据同步”。基本算法是: i1 = 0 i2 = 0 while (i1 < list1.size && i2 < list2.size) { if (list1[i1] < list2[i2]) { //list1[i1] is not in list2 i1++ } else if (list1[i1] > list2[i2]) { //list2[i2] is not in list1 i2++ } else { //item is in both lists i1++ i2++ } } if (i1 < list1.size) //all remaining list1 items are not in list2 if (i2 < list2.size) //all remaining list2 items are not in list1



4
投票

List<ListItem> list1 = GetYourList1(); List<ListItem> list2 = GetYourList2(); var diff = list1.Except(list2);

您的具体示例:

var diff = newList.Except(existingList);

不确定它是否是最有效的,但它很简洁:)


3
投票

public static List<ListItem> CompareLists(List<ListItem> existingList, List<ListItem> newList) { List<ListItem> mergedList = new List<ListItem>(); mergedList.AddRange(newList); mergedList.AddRange(existingList.Except(newList, new ListItemComparer())); return mergedList.OrderByDescending(x => x.Score).Take(10).ToList(); } public class ListItemComparer : IEqualityComparer<ListItem> { public bool Equals(ListItem x, ListItem y) { return x.Name == y.Name; } public int GetHashCode(ListItem obj) { return obj.Name.GetHashCode(); } }

你可以这样称呼它:

newList = CompareLists(existingList, newList);

	
© www.soinside.com 2019 - 2024. All rights reserved.