Time complexity 计算函数时间复杂度

Time complexity 计算函数时间复杂度,time-complexity,Time Complexity,我试图计算这个函数的时间复杂度 代码 int Almacen::poner_items(id_sala s, id_producto p, int cantidad){ it_prod r = productos.find(p); if(r != productos.end()) { int n = salas[s - 1].size(); int m = salas[s - 1][0].size(); for(int i = n - 1; i >= 0 &

我试图计算这个函数的时间复杂度

代码

int Almacen::poner_items(id_sala s, id_producto p, int cantidad){
it_prod r = productos.find(p);
if(r != productos.end()) {
    int n = salas[s - 1].size();
    int m = salas[s - 1][0].size();
    for(int i = n - 1; i >= 0 && cantidad > 0; --i) {
        for(int j = 0; j < m && cantidad > 0; ++j) {
            if(salas[s - 1][i][j] == "NULL") {
                salas[s - 1][i][j] = p;
                r->second += 1;
                --cantidad;
            }
        }
    }
}
else {
    displayError();
    return -1;
}
return cantidad;
int Almacen::poner_项目(id_sala s,id_producto p,int cantidad){
it_prod r=productos.find(p);
如果(r!=productos.end()){
int n=salas[s-1].size();
int m=salas[s-1][0].size();
对于(int i=n-1;i>=0&&cantidad>0;--i){
对于(int j=0;j0;++j){
if(salas[s-1][i][j]=“空”){
salas[s-1][i][j]=p;
r->second+=1;
--康蒂达;
}
}
}
}
否则{
displayError();
返回-1;
}
返回康蒂达;
}

变量productos是一个std::map,其find方法的时间复杂度为Olog(n),而其他变量salas是一个std::vector。 我计算了时间,发现它是log(n)+nm,但不确定它是否是正确的表达式,或者我应该将它保留为nm,因为它是最差的,或者如果我只使用n²


感谢

一般来说,当使用大O表示法时,当将所有变量取为无穷大时,只留下最主要的项

n
本身在无穷远处比
logn
大得多,因此即使没有
m
你也可以(通常应该)去掉
logn
项,因此
O(nm)
在我看来很好

在非理论用例中,理解实际复杂性(对于非无限输入)有时很重要,因为有时在无穷远处速度较慢的算法可以为较短的输入产生更好的结果(有一些例子,其中O(1)算法有一个可怕的常数,指数算法在现实生活中做得更好)。快速排序被认为是O(n^2)算法的一个实际例子,它通常比对应的
O(n logn)
算法做得更好


阅读“大O表示法”了解更多信息。

一般来说,当使用大O表示法时,将所有变量取为无穷大时,只留下最主要的项

n
本身在无穷远处比
logn
大得多,因此即使没有
m
你也可以(通常应该)去掉
logn
项,因此
O(nm)
在我看来很好

在非理论用例中,理解实际复杂性(对于非无限输入)有时很重要,因为有时在无穷远处速度较慢的算法可以为较短的输入产生更好的结果(有一些例子,其中O(1)算法有一个可怕的常数,指数算法在现实生活中做得更好)。快速排序被认为是O(n^2)算法的一个实际例子,它通常比对应的
O(n logn)
算法做得更好

阅读“大O符号”了解更多信息。

整体功能为O(nm)。Big-O表示法是关于“在大值的极限范围内”(忽略常量因子)。忽略“小”开销(如O(logn)查找,甚至O(logn)排序)

实际上,O(nlogn)排序情况要复杂一些。如果您期望m的大小通常与n的大小相同,那么如果您期望n,那么O(nm+nlogn)==O(nm)≫ m、 然后O(nm+nlogn)=O(nlogn)

顺便说一下,这不是一个关于C++的问题。

< P>整个函数是O(nm)。Big-O表示法是关于“在大值的极限范围内”(忽略常量因子)。忽略“小”开销(如O(logn)查找,甚至O(logn)排序)

实际上,O(nlogn)排序情况要复杂一些。如果您期望m的大小通常与n的大小相同,那么如果您期望n,那么O(nm+nlogn)==O(nm)≫ m、 然后O(nm+nlogn)=O(nlogn)

顺便说一下,这不是关于C++的问题。

k = productos.size()
n = salas[s - 1].size()
m = salas[s - 1][0].size()
你的算法是O(log(k)+nm)。您需要为每个独立变量使用不同的名称

现在可能是这样的情况,
k
n
m
之间存在关系,您可以使用一组简化的变量重新标记,但这无法从您的代码中辨别出来,您需要了解数据

也可能是这样的,其中一些项不会变大,在这种情况下,它们实际上是常量,即O(1)

例如,您可能知道
klet

你的算法是O(log(k)+nm)。您需要为每个独立变量使用不同的名称

现在可能是这样的情况,
k
n
m
之间存在关系,您可以使用一组简化的变量重新标记,但这无法从您的代码中辨别出来,您需要了解数据

也可能是这样的,其中一些项不会变大,在这种情况下,它们实际上是常量,即O(1)


例如,你可能知道,
k没有关系,但是k与m相比很小,n没有关系,但是k与m和n相比很小