这种算法分析是否正确?

时间:2015-11-13 16:03:56

标签: algorithm big-o code-analysis asymptotic-complexity

想象一下,有一个整数向量,从位置-infinite..2..1..0..1..2 .. +无限。
只有一个位置包含一个整数值1,其他位置将包含0,算法将找到包含整数值1的位置。

考虑“verifyDoor”方法O(1 )。

我已经提供了这个解决方案,我想知道我的分析是否正确。

我得出以下结果:
T(n)= 8n + 10
T(n)= O(n)

这是:enter image description here

代码:

int findDoor(int[] wall){
    if(verifyDoor(0)){              // 1
        return 0;                   // 1
    }

    int p =1;                       // 1
    while(1){                       // n
        if(verifyDoor(p)){          // n+1
            return p;               // n+1
        }else{                      // n+1
            if(p>0){                // n+1
                p=p*-1;             // n+1
            }else{                  // n+1
                p=(p*-1)+1;         // n+1
            }
        }
    }
}

考虑“n”向量长度
T(n)= 8n + 10(这将是每条指令运行的总次数)
T(n)= O(n)

2 个答案:

答案 0 :(得分:2)

是的,它是O(n),但计算为8n + 10通常没有多大意义,因为某些操作需要比另一个更多的时间而你甚至都不知道它。

例如}else{并不总是需要额外的时间,因为有些编译器只是实现" goTo",无论它是否跳转到"否则"分支或在if分支之后......

或者声明变量可以花费100个计时器而不是给它等值。

答案 1 :(得分:2)

O(N)?什么是n?你需要定义n。

如果n是门与位置0的距离,那么复杂度为O(n)。

这是因为,对于位置i的门,算法访问[ - | i |,| i |]中的每个位置一次(除了-i,如果我是正的),并且只有2 | i |或2 | i | + 1个这样的职位。每次访问需要O(1)时间。