比较两个数组是否相同的最快方法是什么?

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)

  • @Ani:一个例子是{"cat","cat","dog"},{"cat","dog","dog"}.这些数组不是彼此的排列,但表达式返回true. (3认同)