C# 尽可能快地确定两个列表之间更改的算法?

C# 尽可能快地确定两个列表之间更改的算法?,c#,asp.net,C#,Asp.net,我有项目 这些项目通过API从站点A下载到我的站点 我从站点A下载所有项目 我这边有匹配的JSON对象。重要的是我需要这样做 列表A(我的站点)需要与列表B(他们的站点)同步 由于api限制,我必须手动同步 因此有项目和属性: 给定列表A和列表B。什么是快速算法,以便: If A is missing object from B, add it. If B no longer contains an element found in A, remove it from A. If an attr

我有项目

这些项目通过API从站点A下载到我的站点

我从站点A下载所有项目

我这边有匹配的JSON对象。重要的是我需要这样做

列表A(我的站点)需要与列表B(他们的站点)同步

由于api限制,我必须手动同步

因此有项目和属性:

给定列表A和列表B。什么是快速算法,以便:

If A is missing object from B, add it.
If B no longer contains an element found in A, remove it from A.
If an attribute in B is != an attribute in an object from A, update the object in A.
我觉得做很多这件事的唯一方法是O(N^2)。有没有办法在某些方面比O(N^2)更好


感谢使用一些HashSet实现来检查“Contains”条件,平均复杂度也应该小于n^2

A缺少B中的对象,请添加它

如果B不再包含在A中找到的元素,请将其从A中删除

如果B中的属性为!=来自的对象中的属性,更新A中的对象


请注意,所有这些算法的渐近复杂性都是两个集合大小的和,而不是两个集合大小的乘积
Exception
Join
将分别创建一个基于集合的数据结构,其中包含一个输入序列中的所有项,然后使用O(1)个基于集合的操作在另一个序列上迭代。

注:如果元素是唯一的(即没有重复的元素),这种方法非常有效。正确,但看起来Milo已经有了识别某种类型的唯一性的机制,如果他发现并删除列表之间的重复项,你可以在O(n logn)时间内对两个列表进行排序。你能想出一种算法来比较两个在线性时间内运行的排序列表吗?使用HashSet和/或一些LINQ连接/联合/例外是相当简单的。前者可能会带来更好的边界,但后者可能是。。好吧,更灵巧。
listA.AddRange(listB.Except(listA)); //note O(N+M) not O(N*M)
listA.RemoveAll(listA.Except(listB)); //note O(N+M) not O(N*M)
 //note O(N+M) not O(N*M)
var pairs = listA.Join(listB, 
    item => item.Key, 
    item => item.Key, 
    (a, b) => new { a, b });

foreach(var pair in pairs)
{
    //compare the properties of the items and mutate `pair.a` as appropriate
}