izb*_*izb 12 c# arrays algorithm equality
我有两个对象数组,它们可能具有相同的值,但顺序不同,例如
{ "cat", "dog", "mouse", "pangolin" }
{ "dog", "pangolin", "cat", "mouse" }
Run Code Online (Sandbox Code Playgroud)
我希望将这两个数组视为相等.测试这个的最快方法是什么?
Ani*_*Ani 18
我不能保证这是最快的,但它肯定非常有效:
bool areEquivalent = array1.Length == array2.Length
&& new HashSet<string>(array1).SetEquals(array2);
Run Code Online (Sandbox Code Playgroud)
编辑:SaeedAlg和Sandris提出了有关重复的不同频率的有效点,导致这种方法出现问题.如果这很重要,我可以看到两个解决方法(没有充分考虑它们各自的效率):
1.排序数组然后按顺序进行比较.理论上,这种方法在最坏的情况下应该具有二次复杂性.例如:
return array1.Length == array2.Length
&& array1.OrderBy(s => s).SequenceEqual(array2.OrderBy(s => s));
Run Code Online (Sandbox Code Playgroud)
2.在每个数组中建立一个字符串频率表,然后进行比较.例如:
if(array1.Length != array2.Length)
return false;
var f1 = array1.GroupBy(s => s)
.Select(group => new {group.Key, Count = group.Count() });
var f2 = array2.GroupBy(s => s)
.Select(group => new {group.Key, Count = group.Count() });
return !f1.Except(f2).Any();
Run Code Online (Sandbox Code Playgroud)