C++ 如何在小于O(n)的时间复杂度下检查两个std::vector是否相等

C++ 如何在小于O(n)的时间复杂度下检查两个std::vector是否相等,c++,time-complexity,big-o,stdvector,C++,Time Complexity,Big O,Stdvector,我们可以像这样用for循环比较两个向量 bool checkEquality(vector<int> &A, vector<int> &B){ if(A.size() != B.size()) return false; int i=0,j=0; while(i<A.size() && j<B.size()){ if

我们可以像这样用for循环比较两个向量

    bool checkEquality(vector<int> &A, vector<int> &B){
         if(A.size() != B.size())
             return false;
         int i=0,j=0;
         while(i<A.size() && j<B.size()){
             if(A[i++] != B[j++])
                 return false;
         return true;
    }
以上代码是否比O(n)快

有没有更好的方法来检查两个向量是否相等

是的,有:
A==B
工作正常,比您的代码简单得多

A==B比O(n)快

不,这在一般情况下是不可能的。如果我们知道一些关于数据的信息,比如差异总是在接近开始或结束时发现,那么我们只能做得比O(n)更好

有没有更好的方法来检查两个向量是否相等

是的,有:
A==B
工作正常,比您的代码简单得多

A==B比O(n)快


不,这在一般情况下是不可能的。如果我们对数据有所了解,我们只能做得比O(n)更好,例如,差异总是在接近开始或结束时出现。

不,没有更快的方法。第二个代码的时间复杂度也是O(N),因为它只是(或多或少地)做第一个代码正在做的事情就足够了。如果两个大小相同的任意向量相等,则只能通过检查所有元素来确定。否则,出现假阳性或假阴性的概率为非零(即,不存在时表示它们相等,反之亦然)。所以最坏情况下的复杂度是O(n)(如果向量相等)。如果它们不相等,那么就有可能停止检查第一个不匹配-这就是
std::memcmp(&A[0],&B[0],size*sizeof(int))
所做的(如果
A
B
相等,则返回零(但这仅适用于基本类型的向量,如
int
,而不是非普通类型))。没有更快的方法。第二个代码的时间复杂度也是O(N),因为它只是(或多或少地)做第一个代码正在做的事情就足够了。如果两个大小相同的任意向量相等,则只能通过检查所有元素来确定。否则,出现假阳性或假阴性的概率为非零(即,不存在时表示它们相等,反之亦然)。所以最坏情况下的复杂度是O(n)(如果向量相等)。如果它们不相等,则可以停止检查第一个不匹配项,这就是
std::memcmp(&A[0],&B[0],size*sizeof(int))
所做的(如果
A
B
相等,则返回零(但这仅适用于基本类型的向量,如
int
,而不是非普通类型))。
if(A==B) 
   return true;
else 
   return false;