我试图找出函数的时间复杂度(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循环中发生了什么。
有人可以彻底解释两者的时间复杂性 功能?谢谢!
答案 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 //= 2
。 i >>= 1
有n
个数字,每次迭代都会丢弃一个二进制数字(向右移动),因此如果我们假设{{{>> Θ(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。对于这类事情来说,这是一个很好的课程。我的计算中有点草率。