恒定长度循环的时间复杂度

时间:2016-03-14 16:46:39

标签: algorithm time-complexity

我很难决定如何在类中声明函数的最坏情况运行时复杂性。

这个类存储两种对象,比如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)?

2 个答案:

答案 0 :(得分:2)

  

K是给定常数,不依赖于N和M

请注意,句子的第一部分和最后部分不是自相矛盾的。

如果k不依赖M,N - 这并不意味着它不会独立增长。如果它确实增长(以什么速率无关紧要),则是函数的参数 - 复杂性取决于它并且确实是O(k^2)

如果k是常量并且永远不会改变,那么这确实是O(1),因为k^2 < C对于某些常量 C=k^2+1

在迭代中使用常量值的常见示例是:

  • 在执行字符串算法时(例如trie),查看有限大小的字母表。
  • 查看固定整数的位数。

这些被视为O(1),即使它们是用循环实现的,重要的是 - 时间    处理循环受有限大小的限制。

答案 1 :(得分:2)

说复杂性为O(K²)更具信息性和无害性。然后,知道K是有界的,你会隐含地断定这是O(1)。

在实践中,隐藏常数为5或5000000会产生影响。