加扰数组 - 检查数组中的元素是否与O(n)复杂度匹配(顺序无关紧要)

时间:2016-03-11 03:15:35

标签: c

我试图编写带有两个数组的代码,如果它们的元素匹配(顺序无关紧要)则返回1,如果它们不匹配则返回0。

  1. 必须是O(n)
  2. 我已经编写了一些不同的算法,一个比较两个数组的总和,如果它们相同则返回1,如果它们不是,则返回0,但如果数组包含不同的值元素总结到同样的事情然后这不起作用。

    找到一个O(n ^ 2)很简单(两个用于循环,比较,然后迭代A的下一个位置等。

    我似乎无法弄清楚这样做的O(n)。我当前的代码取值的差异,如果它的0返回1仍然不知道如何处理不排序相同的乱序数组。是否有O(n)这样做?

    int scrambled( unsigned int a[], unsigned int b[], unsigned int len)
    {
        int count[100];
        int flag = 1;
        int i;
    
        for(i=0; i<100; i++){
            count[i] = 0;
        }
    
        for(i=0; i<len; i++){
            count[a[i]]++;
            count[b[i]]--;
        }
    
        for(i=0; i<100; i++){
            if(count[i] != 0){
                return 0;
            }
        }
        return flag;
    

1 个答案:

答案 0 :(得分:2)

如果您可以使用C ++ 11,std::unordered_set可以在O(n)时填充O(n),然后您可以执行O(n)元素成员资格测试(它仍然是{{1}即使你做了两次,常数乘数也不算数。

如果C ++ 11已经用完,你仍然可以使用与手写哈希集相同的基本算法,或者如果每个元素的元素都在有界范围内,你可以使用counting sortO(n+k)归功于专业的数字范围,如果范围很小,则k分量并不重要。