Algorithm 定长循环的时间复杂度

Algorithm 定长循环的时间复杂度,algorithm,time-complexity,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; } } } void fo

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

这个类存储两种对象,比如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;
        }
    }
}
void foo(项目){
对于(int i=0;i
K是一个给定的常数,它不依赖于N和M

注意句子的第一部分和最后一部分并不矛盾

如果
k
不依赖于
M,N
,这并不意味着它不是独立增长的。如果它确实增长了(不管以什么速度),of是函数的一个参数-复杂性取决于它,实际上是
O(k^2)

如果
k
是常数并且从不改变,这确实是O(1),因为
k^2
对于某些常数
C=k^2+1

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

  • 在执行字符串算法时检查有限大小的字母表(例如)
  • 检查固定整数的位
这些被视为
O(1)
,即使它们是通过循环实现的,重要的是时间
处理循环的大小是有限的。

说复杂度是O(K²)更具信息性,也更无害。然后,知道K是有界的,你会含蓄地得出这是O(1)


实际上,隐藏常数是5或5000000会产生不同。

如果
k
是一个常数,这肯定在
O(1)
的范围内。谢谢你的回答@amit。字母表的例子让人大开眼界。只是我在论坛或文献中找不到一个关于这个案例的参考。我发现的只是更简单“循环是O(N^k)”。@bts不要与指数常量混淆。
O(N^k)
不同于
O(N^(k+1))
并且不能忽略。我认为在分析程序时,您看到的最常见的情况是假设整数的大小为常数(通常为2^31)因此,整数上的算术运算被认为是“代码>O(1)< /代码>。(如果使用无界整数库,情况就不是这样)。我甚至认为隐藏O(1)符号后面大的常数是有点不诚实的。