算法运行时复杂度递归BIG-O

时间:2015-11-15 16:06:05

标签: algorithm recursion

我理解Big O符号的概念及其最近让我自己学习的东西。

但是对于一个给定的算法来说,它递归调用自己直到作业完成,如果我的return语句中有一个OR,那对Big O表示法有什么影响呢?

这是迄今为止的算法:

**Algorithm: orderedSort(a,b,c)**
given strings a,b,c determine whether c is an ordered shuffle of a and b

l := length of (a + b)
if (l = 0) then
    return true
if (l not = length of c)
    return false
else
    d := substring of a position 1 to 1
    e := substring of b position 1 to 1
    f := substring of c position 1 to 1
if (d = f) then 
    return orderedSort(a-d, b, c-f) 
if (e = f) then
    return orderedSort(a, b-e, c-f)
if (d and e = f) then
    return orderedSort(a-d, b, c-f) or orderedSort(a, b-e, c-f)

是否拥有或使其成为n ^ 2?

1 个答案:

答案 0 :(得分:1)

这比你想象的要糟糕得多。如果“或”的两半都需要在某个时间内进行评估,那么最终会得到O(2 ^ n)(不是O(n ^ 2))递归调用。

让我们说它占了OR的两半时间。平均而言,在你做两半之前你必须降低10级,所以你有:

1 call with length n
2 calls with length n-10
4 calls with length n-20
8 calls with length n-30
...
2^(n/10) calls with length 0

此外,它再次糟糕,因为所有这些字符串操作(长度(a + b),a-d等)需要O(n)时间,而不是恒定时间。

编辑:我应该提到O(2 ^ n)实际上并不正确。它是“指数时间”,但O(2 ^(n / 10))或其他任何严格小于O(2 ^ n)。写它的正确方法是2 ^ O(n)

编辑:

这个问题的一个很好的解决方案是使用动态编程。

如果c的前i + j个字符是a的前i个字符和b的前j个字符的有序shuffle,则OK(i,j)= true。

OK(i,0)很容易为所有i计算。然后你可以从OK(i,j-1)计算所有OK(i,j)。当你用i + j = length(c)覆盖所有情况时,如果其中任何一个为真,则返回true。