Algorithm 检查两个数组是否具有相同的内容,忽略顺序,不进行排序。最有效的算法是什么

Algorithm 检查两个数组是否具有相同的内容,忽略顺序,不进行排序。最有效的算法是什么,algorithm,Algorithm,扰码应返回1的数组示例: a = {10,15,20}, b = {10,15,20} a = {99}, b = {99} a = {1,2,3,4,5}, b = {5,3,4,2,1} a = {}, b = {} (i.e. len = 0) a = {2,1,3,4,5}, b = {1,2,4,3,5} 扰码应返回0的数组示例: a = {1,1}, b = {1,2} a = {10,15,20}, b = {10,15,21} a = {1,2,3,4,5}, b = {5,

扰码应返回1的数组示例:

a = {10,15,20}, b = {10,15,20}
a = {99}, b = {99}
a = {1,2,3,4,5}, b = {5,3,4,2,1}
a = {}, b = {} (i.e. len = 0)
a = {2,1,3,4,5}, b = {1,2,4,3,5} 
扰码应返回0的数组示例:

a = {1,1}, b = {1,2}
a = {10,15,20}, b = {10,15,21}
a = {1,2,3,4,5}, b = {5,3,4,2,2} 
我的C代码是这样的,但它是一个O(N^2),效率不高

int scrambled( unsigned int a[], unsigned int b[], unsigned int len )
{
    int count1 = 0;
    int count2 = 0;

    for (int i=0; i< len; i++)
    {
        for (int j=0;j<len; j++)
        {
            if (a[i]==b[j])
            {
                count1++;
                break;
            }       
        }

        for (int j=0; j<len; j++)
        {
            if (b[i]==a[j])
            {
                count2++;
                break;
            }
        }
    }

    return (count1 == len && count2 == len );


}
int加扰(无符号int a[],无符号int b[],无符号int len)
{
int count1=0;
int count2=0;
对于(int i=0;i对于(int j=0;j,这里有一个可以用O(n)复杂度实现的解决方案:

  • 为每个数组创建哈希映射。键是数组元素。值是出现的次数
  • 迭代第一个散列的键 映射并检查两个哈希映射的值是否相同
  • 如果所有值都相同,则数组相等

  • 这是固定代码

    # include <stdio.h>
    
    int scrambled( unsigned int a[], unsigned int b[], unsigned int len )
    {
        int count [99] = {0};
        for (int i=0; i < len; i++)
        {
            count [a[i]]++;
            count [b[i]]--;     
        }
        for (int i=0; i < 99; i++)
        {
            if (count[i]!=0){return 0;}
        }
        return 1;
    }
    
    #包括
    加扰整数(无符号整数a[],无符号整数b[],无符号整数len)
    {
    整数计数[99]={0};
    对于(int i=0;i
    根据
    {1,2,2,3,5}
    {1,2,3,3,5}测试代码
    ,它将返回true。是的,你是对的!解决方案在这里:@DiWang:如果数组有重复的元素,这个解决方案也有效吗?我上面的代码有缺陷。但是来自该链接的算法,是的,它有效。请参阅下面我更新的代码。这仅在数组元素是范围有限的整数时有效,在本例中为[0,98]。它实际上不是O(n),而是O(max(n,m)),其中m是范围的大小。是的,你是对的。我们必须首先知道所有可能的元素。实际上,它不一定是哈希表。你可以使用任何支持快速查找和插入的数据结构。如果你不想使用哈希表,你可以使用数组(优点:非常简单)或某种搜索树(优点:空间复杂度较低)。@anatolyg:是的,在许多实际情况下,这些方法都会与哈希映射同样有效,甚至更好。但它们并不像哈希映射那样通用。数组只适用于整数元素(用作索引)当使用树时,算法的时间复杂度通常为O(nlog(n))。