我很难决定如何在类中声明函数的最坏情况运行时复杂性。
这个类存储两种对象,比如N和M,可能有数百万个。
其中一项操作只是搜索存储物品的最佳位置:
void foo(item) {
for (int i=0;i<K;i++) {
for (int j=i;j<K;j++) {
if(store(i,j,item)) // store is O(1)
return;
}
}
}
这里K是一个问题定义的常数(比如10)。在最坏的情况下,可能无法存储该项目并且循环将耗尽。
我无法确定foo是否具有O(1)复杂度更正确,因为K是一个不依赖于N和M的给定常数;或者最好说复杂性是O(k 2 )。甚至可以摊还O(1)?
答案 0 :(得分:2)
K是给定常数,不依赖于N和M
请注意,句子的第一部分和最后部分不是自相矛盾的。
如果k
不依赖M,N
- 这并不意味着它不会独立增长。如果它确实增长(以什么速率无关紧要),则是函数的参数 - 复杂性取决于它并且确实是O(k^2)
。
如果k
是常量并且永远不会改变,那么这确实是O(1),因为k^2 < C
对于某些常量 C=k^2+1
。
在迭代中使用常量值的常见示例是:
这些被视为O(1)
,即使它们是用循环实现的,重要的是 - 时间
处理循环受有限大小的限制。
答案 1 :(得分:2)
说复杂性为O(K²)更具信息性和无害性。然后,知道K是有界的,你会隐含地断定这是O(1)。
在实践中,隐藏常数为5或5000000会产生影响。