计算函数时间复杂度

时间:2018-04-27 09:22:58

标签: time-complexity

我正在尝试计算此函数的时间复杂度

代码

layer.isLayerOnMap // Return true 

}

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

由于

3 个答案:

答案 0 :(得分:1)

通常,在使用大O表示法时,只有在将所有变量都设置为无穷大时才会保留最主要的术语。

n本身比无限远log n大得多,所以即使没有m你也可以(通常应该)删除log n项,所以{{1对我来说很好看。

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

了解更多信息,请阅读“Big O Notation”。

答案 1 :(得分:1)

整体功能为O(nm)。 Big-O符号都是关于“在大值的极限”(并忽略常数因子)。 “小”开销(如O(log n)查找,甚至是O(n log n)排序)将被忽略。

实际上,O(n log n)排序情况有点复杂。如果你希望m通常与n的大小相同,那么O(nm + nlogn)== O(nm),如果你期望n?m,那么O(nm + nlogn)== O(nlogn)。

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

答案 2 :(得分:1)

k = productos.size()
n = salas[s - 1].size()
m = salas[s - 1][0].size()

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

现在情况可能是knm之间存在关联,您可以使用减少的变量集重新标记,但这是不可辨别的从您的代码中,您需要了解数据。

也可能是这些术语中的一些不会变大,在这种情况下它们实际上是常数,即O(1)。

E.g。您可能知道k << nk << mn ~= m,这允许您将其描述为O(n ^ 2)