检查两个未排序的整数数组是否具有相同元素的算法?

时间:2015-10-11 18:27:09

标签: c arrays multiset

我在C语言编程方面仍然是新手,所以请仔细解释。此外,这是一个家庭作业,所以如果你能帮助我解决这个问题,我会很高兴。我环顾了网站,只能找到类似这个问题的帖子。我找到的那些提到了像哈希表这样的东西,我没有学习,所以我怀疑可以使用那些东西。

对于我的作业,我有两个相同长度的未排序整数数组。它们只能有0-99范围内的整数。允许重复元素。目标是查看它们是否具有相同的元素,因此检查它们是否相等,而不对它们进行排序。我的教授还说它必须以线性时间运行,因此排序它们不是一种选择。

例如,

A[4]={1,2,3,4}
B[4]={4,3,2,1}

这些数组是相同的。然而,

A[3]={1,1,2}
B[3]={2,2,1}

这些数组不相等。

我想出的算法是这样的:
第一个for循环遍历第一个数组,内部for循环遍历第二个数组。它将检查第一个数组中的当前元素是否等于第二个数组中的元素。如果它们相等,那么外部循环迭代并且内部for循环再次从第一个元素开始,检查第一个数组中的当前元素是否与第二个元素中的元素匹配。如果没有,则它退出两个循环并返回0表示它们不相等。该算法不在线性时间内运行。此外,它不会检查重复项,因为内部for循环每次都会检查第二个数组中的所有元素。

每当发现第二个数组中的元素值等于第一个数组中的元素时,我就会想到将第二个数组中元素的值更改为非常大的值。我认为这样可以摆脱重复的问题。但我仍然需要帮助制作更快的算法并理解我的错误。谢谢。

3 个答案:

答案 0 :(得分:3)

只需重新考虑您的任务:您必须确定一个阵列是否是另一个阵列的排列。要解决这个问题,你只需要检查每个数组中有多少个零,一个,......,99。也就是说,

  • 让新数组int count[100]初始化为全零
  • 表示每个i:递增count[a[i]]并递减count[b[i]]
  • 如果count[]由全零组成,那么[]和b []是排列。

答案 1 :(得分:1)

一个好的,简单的解决方法是:

  • 排序数组A (在(O(n log n)中)
  • 排序数组B (在O(n log n)中)
  • 比较两个数组(在O(n)中)
  • 结果全部为O(n log n)

    答案 2 :(得分:0)

    要注意的三件事:数组1和数组2的元素之和,乘以
    数组1和数组2的元素,以及它们的零计数。如果满足,则它们是相等的。     #include

    int main(void)
    {
        int A[4] = { 4 , 3 , 2 , 1 }; 
    
        int B[4] = { 6 , 2 , 1 , 1 };
    
        int varA = 1 , varB = 1;
    
        int sumA = 0 , sumB = 0;
    
        int zeroCountA = 0 , zeroCountB = 0; 
    
        for( int n = 0 ; n < 4 ; n++ )
        {
            if( A[n] != 0)
            {
                varA *= A[n];
                sumA += A[n];
            }
            else
            {
                zeroCountA++;
            }
        }
    
        for( int n = 0 ; n < 4 ; n++ )
        {
            if( B[n] != 0)
            {
                varB *= B[n];
                sumB += B[n];
            }
            else
            {
                zeroCountB++;
            }
        }
    
        if( sumA == sumB )
        {
            if( varA == varB )
            {
                if( zeroCountA == zeroCountB )
                    printf("A = B\n");
            }
            else
            {
                printf("A != B\n");
            }
        }
        else
        {
            printf("A != B\n");
        }
    }