代码之家  ›  专栏  ›  技术社区  ›  izb

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

  •  12
  • izb  · 技术社区  · 14 年前

    { "cat", "dog", "mouse", "pangolin" }
    
    { "dog", "pangolin", "cat", "mouse" }
    

    我想把这两个数组当作相等的数组。最快的测试方法是什么?

    6 回复  |  直到 14 年前
        1
  •  18
  •   Ani    14 年前

    我不能保证这是 ,但它确实非常有效:

    bool areEquivalent = array1.Length == array2.Length 
                         && new HashSet<string>(array1).SetEquals(array2);
    

    编辑: SaeedAlg和Sandris提出了不同重复频率的有效点,从而导致了这种方法的问题。如果这一点很重要的话,我可以看到两个解决方案(没有考虑它们各自的效率):

    例如。:

    return array1.Length == array2.Length
           && array1.OrderBy(s => s).SequenceEqual(array2.OrderBy(s => s));
    

    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();
    
        2
  •  4
  •   usr-local-ΕΨΗΕΛΩΝ    14 年前

    我认为唯一合理的方法是把它们分类然后比较。

    O(n logn) 和比较 O(n) O(对数)

        3
  •  2
  •   m.s.    9 年前

    你试过类似的东西吗

    string[] arr1 = {"cat", "dog", "mouse", "pangolin"};
    
    string[] arr2 = {"dog", "pangolin", "cat", "mouse"};
    
    bool equal = arr1.Except(arr2).Count() == 0 && arr2.Except(arr1).Count() == 0;
    
        4
  •  1
  •   Martin DeMello    14 年前

        5
  •  0
  •   Albin Sunnanbo    14 年前

    假设没有重复项,我将使用哈希集

    string[] arr1 = new string[] { "cat", "dog", "mouse", "pangolin" };
    string[] arr2 = new string[] { "dog", "pangolin", "cat", "mouse" };
    
    bool result = true;
    if (arr1.Length != arr2.Length)
    {
        result = false;
    }
    else
    {
        HashSet<string> hash1 = new HashSet<string>(arr1);
        foreach (var s in arr2)
        {
            if (!hash1.Contains(s))
                result = false;
        }
    }
    

    编辑:

        6
  •  0
  •   Mohammad Mazaz    14 年前

    伪码:

    A:array
    B:array
    C:hashtable
    
    if A.length != B.length then return false;
    
    foreach objA in A
    {
    H = objA;
    if H is not found in C.Keys then
    C.add(H as key,1 as initial value);
    else
    C.Val[H as key]++;
    }
    
    foreach objB in B
    {
    H = objB;
    if H is not found in C.Keys then
    return false;
    else
    C.Val[H as key]--;
    }
    
    if(C contains non-zero value)
    return false;
    else
    return true;