C++ 如何在小于O(n)的时间复杂度下检查两个std::vector是否相等
我们可以像这样用for循环比较两个向量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
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;