我正在尝试计算此函数的时间复杂度
代码
layer.isLayerOnMap // Return true
}
变量 productos 是一个std :: map,其find方法的时间复杂度为Olog(n),其他变量 salas 是std :: vector。 我计算了时间,我发现它是 log(n)+ n m 但不确定它是否是正确的表达式,或者我应该将其保留为 n m 因为它是最糟糕的,或者我只会使用n²。
由于
答案 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)。您需要为每个自变量使用不同的名称
现在情况可能是k
,n
,m
之间存在关联,您可以使用减少的变量集重新标记,但这是不可辨别的从您的代码中,您需要了解数据。
也可能是这些术语中的一些不会变大,在这种情况下它们实际上是常数,即O(1)。
E.g。您可能知道k << n
,k << m
和n ~= m
,这允许您将其描述为O(n ^ 2)