什么是查找两个
我们使用的是C# 2.0,因此请尽可能不要使用扩展方法!
编辑:对于有序和无序的集合,答案都很有趣,希望每个答案都不同。
ICollection<T>
集合是否包含完全相同的条目的最快方法?暴力破解很明显,我想知道是否有更优雅的方法。我们使用的是C# 2.0,因此请尽可能不要使用扩展方法!
编辑:对于有序和无序的集合,答案都很有趣,希望每个答案都不同。
ICollection<T>
集合是否包含完全相同的条目的最快方法?暴力破解很明显,我想知道是否有更优雅的方法。首先比较集合的Count,如果它们具有相同的计数,则对所有元素进行暴力比较。最坏情况下是O(n)。这是在元素顺序需要相同的情况下。
第二种情况是顺序不同的情况下,您需要使用字典来存储集合中找到的元素的计数:以下是可能的算法
使用C5
http://www.itu.dk/research/c5/
检查提供的集合中的所有项是否在此包中(计算重复项)。要查找的项。如果找到所有项,则为True。
[Tested]
public virtual bool ContainsAll<U>(SCG.IEnumerable<U> items) where U : T
{
HashBag<T> res = new HashBag<T>(itemequalityComparer);
foreach (T item in items)
if (res.ContainsCount(item) < ContainsCount(item))
res.Add(item);
else
return false;
return true;
}
对于有序集合,您可以使用由System.Linq.Enumerable
定义的SequenceEqual()
扩展方法:
if (firstCollection.SequenceEqual(secondCollection))
再次使用C5库,有两个集合,您可以使用:
C5.ICollection<T> set1 = C5.ICollection<T> (); C5.ICollection<T> set2 = C5.ICollecton<T> (); if (set1.UnsequencedEquals (set2)) { // 做一些事情 }
C5库包括一个启发式算法,实际上首先测试两个集合的无序哈希码(请参见C5.ICollection<T>.GetUnsequencedHashCode()
),因此如果两个集合的哈希码不相等,则不需要迭代每个项以测试相等性。
还要注意的是,C5.ICollection<T>
继承自System.Collections.Generic.ICollection<T>
,因此您可以在仍然使用.NET接口的同时使用C5实现(尽管通过.NET的吝啬接口访问的功能较少)。
暴力破解需要O(n) - 比较所有元素(假设它们已排序),我认为这是你能做的最好的事情 - 除非数据具有某些属性使其更容易。
我想对于未排序的情况,它的时间复杂度是O(n*n)。
在这种情况下,我认为基于归并排序的解决方案可能会有所帮助。
例如,您是否可以重新设计它,使只有一个集合?或者3个集合,一个用于仅在集合A中的元素,一个用于仅在B中的元素,另一个用于两者都在的元素 - 因此,如果仅在A和B中的元素为空,则它们相同...我可能完全走错了方向...