函数的时间复杂度

时间:2015-02-17 22:37:58

标签: python time-complexity

我试图找出函数的时间复杂度(Big-O)并尝试提供适当的理由。

第一个功能是:

r = 0
# Assignment is constant time. Executed once. O(1)
for i in range(n):
    for j in range(i+1,n):
        for k in range(i,j):
            r += 1
            # Assignment and access are O(1). Executed n^3
像这样。

我看到这是三重嵌套循环,所以它必须是O(n ^ 3)。 但我认为我的推理非常薄弱。我真的不知道会发生什么 在这里的三重嵌套循环里面

第二个功能是:

i = n
# Assignment is constant time. Executed once. O(1)
while i>0:
    k = 2 + 2
    i = i // 2
    # i is reduced by the equation above per iteration.
    # so the assignment and access which are O(1) is executed
    # log n times ??

我发现这个算法是O(1)。但就像第一个功能一样, 我不知道while循环中发生了什么。

有人可以彻底解释两者的时间复杂性 功能?谢谢!

2 个答案:

答案 0 :(得分:1)

对于这样一个简单的案例,你可以find the number of iterations of the innermost loop as a function of n exactly

sum_(i=0)^(n-1)(sum_(j=i+1)^(n-1)(sum_(k=i)^(j-1) 1)) = 1/6 n (n^2-1)

Θ(n**3) 时间复杂度(see Big Theta):如果r += 1具有{{1},则假定r为O(1)数字(model has words with log n bits)。

第二个循环更简单:O(log n)i //= 2i >>= 1n个数字,每次迭代都会丢弃一个二进制数字(向右移动),因此如果我们假设{{{>> Θ(log n) 时间复杂度,则整个循环是 Θ(log n) 时间复杂度1}} i >> 1位的移位是O(1)操作(与第一个例子中的模型相同)。

答案 1 :(得分:-4)

首先,对于第一个函数,时间复杂度似乎更接近于O(N log N),因为每个循环的参数每次都会减少。

此外,对于第二个函数,运行时为O(log2 N)。除了,说i == n == 2.一次运行后我是1.在另一次之后我是0.5。另一个我是0.25。等等...我假设你想要int(i)。

对于每个功能的严格数学方法,您可以转到https://www.coursera.org/course/algo。对于这类事情来说,这是一个很好的课程。我的计算中有点草率。